Install Koneksi PHP untuk MS SQL Server di CENTOS 8

Sebetulnya untuk instalasi sqlsrv bisa dilihat di webnya microsoft tapi gak papa, tak tambahin disini aja buat catatan

Install ODBC Driver

ini buat centos 8 ya, dan ambilnya dari rhel8
curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repo

exit
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts
sudo ACCEPT_EULA=Y yum install msodbcsql17

# cuman buat koneksi via CLI

sudo ACCEPT_EULA=Y yum install mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

sudo yum install unixODBC-devel

Install prequsites sebelum install sqlsrv

dnf install php-xml php-pdo php-pear php-devel

Di gw muncul error pada saat install php-devel padahal sebelumnya di Centos 7 kaga. Jadi kalao install di Centos 8 harus jalankan perintah ini dulu:

dnf config-manager --set-enabled PowerTools

baru jalankan yum install php-devel. dan kebetulan error ahahhahaha, ternyata diblock outbound 80 dari servernya, ta matiin dulu firewallnya, males bikin commandnya

systemctl stop firewalld

Install sqlsrv

pecl install sqlsrv
pecl install pdo_sqlsrv

kondisi firewall dan SELinux mati ya, kalau idup ya musti disetting dulu koneksinya yg dibolehkan

setelah selesai, bikin koneksi sederhana pake php trus jalankan

$hostname = 'namaserver'; 
$username = 'namauser'; 
$password = 'katasandi'; 
$database = 'namadatabase'; 

$serverName = $hostname; 

$connectionOptions = array(
    "database" => $database,
    "uid" => $username,
    "pwd" => $password
);

// Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
    die(formatErrors(sqlsrv_errors()));
}

// Select Query
$tsql = "SELECT @@Version AS SQL_VERSION";

// Executes the query
$stmt = sqlsrv_query($conn, $tsql);

// Error handling
if ($stmt === false) {
    die(formatErrors(sqlsrv_errors()));
}

dannnn ga jalan, muter2 mulu. Bingunglah gw, gw cobain koneksi pake cli dengan command :

sqlcmd -S namaserver -U namauser -P password -d namadatabase -Q "select * from tablenya" 

dan hasilnya tetep ga bisa

Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol].
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.

Untungnya, kalo di CLI jelas terpampang errornya, tadi sempet gw state; ga jalan muter2 mulu. itu masih mending. kalau di Codeigniter, dia ga bisa return object hasil query! kan bangke, kaga muncul error detailnya, cuman muncul :

Message: Call to a member function num_rows() on bool

kampret bener, gugling sampe bego jawabannya macem2: salah querylah, tablenya ga ada lah, dan jawaban2 lain yang tidak menyelesaikan!

Dari error di cli, gw ambil kesimpulan konfigurasi SQL Servernya yang dodol, dia masih pake TLS1.0 (untung pernah dibahas di docker, jadi bisa memperkirakan errornya dan ngerti keywordnya apa. coba kalo belum juga pusing itu).

Nah kalo ubuntu gampang, konfigurasi adanya di /etc/ssl/openssl.conf, di Centos ini bangke banget! di folder /etc/ssl isinya cuman link ke folder /etc/pki/certs kalo ga salah dan konfigurasi openssl ada di folder /etc/pki/tls. Sialnya isi konfigurasi beda sama yang di ubuntu. kupret banget!

Akhirnya brosang brosing kesana kemari, nemu web bahasa jepang yang gw juga ngeraba artinya. Jadi di Centos 8 ini secara default crypto-policiesnya make yang baru (kemungkinan TLS2.0). Di dalam folder /etc/crypto-policies ada file config (jangan nanya nemunya gimana, gw juga lupa), di file itu ada statement gini:

* LEGACY: Ensures maximum compatibility with legacy systems (64-bit security)
* DEFAULT: A reasonable default for today's standards (112-bit security).

tuh kan bener! dia pake today standards, sementara SQL Server disana koneksi sslnya jadul. Akhirnya gw edit file config di dalam /etc/crypto-policies, dari value awal DEFAULT gw ubah ke LEGACY. kemudian jalankan command

[root@namaserver ~]# update-crypto-policies
Setting system policy to LEGACY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.

Restart dan langsung berhasil koneksinya ke SQL Server!!

Semoga bisa membantu yang kesulitan kek gw tadi, terima kasih