mysql client authentication protocol refused

Saya memiliki web server A dengan mysql versi 5.6.11 yang didalamnya ada aplikasi php yang harus membaca database di server B. Versi mysql di server B tersebut versi 5.0.77.

Ketika mencoba akses dari server A, baik melalui mysql client di command line maupun script php, koneksi gagal dan muncul error :

ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused (client option ‘secure_auth’ enabled)

Kata google, hal ini disebabkan karena mysql server di server B mendukung baik old style password maupun new style password. Sedangkan mysql client di server A hanya mau menggunakan new style password saja.

Hal ini agak aneh juga sebenarnya. Seharusnya sih kalau server tujuan bisa dua-duanya, client semestinya tinggal memilih yang sesuai saja. Tapi ternyata tidak demikian. Rupanya option ‘secure_auth’ enabled, memaksa client untuk hanya menggunakan new style password saja dan tidak mau ketemu sama sekali dengan pilihan old style ūüôā

Memang new style password lebih aman dibandingkan dengan old style password. Kedepannya developer mysql memang menginginkan agar semua pengguna mysql beralih ke new style password. Namun seting untuk mendukung 2 style seringkali masih harus dilakukan karena masih banyak aplikasi jadul yang menggunakan mysql client yang hanya bisa old style password.

Syukurlah setelah beberapa jam berkonsultasi lebih lanjut dengan google, solusi untuk hal ini ternyata ada. Jika hanya ingin akses dari command line mysql, solusinya dengan menambahkan opsi¬†–secure-auth=FALSE pada baris perintah. Contoh :

mysql>¬†mysql -u NamaUser -h ip-server-tujuan –secure-auth=FALSE -p

Namun jika ingin juga akses dari script php, maka harus dilakukan modifikasi pada password. Caranya lakukan perintah berikut pada server B (tujuan) :

mysql> SET @@session.old_passwords = 0;

jika lancar maka akan muncul :

Query OK, 0 rows affected (0.00 sec)

selanjutnya,

mysql>¬†SET PASSWORD FOR ‘NamaUser’@’192.168.10.5’ = PASSWORD(‘passwordnya’);

jika berhasil akan muncul:

Query OK, 0 rows affected (0.00 sec)

selanjutnya,

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

mysql> quit

cobalah untuk login lagi.

 

setting up freetds and php to access multiple mssql server

This tutorial use 2 microsoft sql server 2008 as database server target. server1 ip is 172.16.8.42 and server2 ip is 172.16.8.51. both mssql must listen on the same tcp/ip port 1433. freetds would be installed at server3 where php + apache are already exist.

AT SERVER3:

1. wget ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz or

ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

2. tar -xzfv freetds-stable.tgz

3. cd freetds-0.91

4. ./configure Р-enable-msdblib  Р-with-tdsver=8.0 Р-prefix=/usr/local/freetds

5. make && make install

6. cp include/tds.h /usr/local/freetds/include

7. cp src/tds/.libs/libtds.a /usr/local/freetds/lib

8. cd to php source or download the same version with the one currently installed. mine is php-5.2.4

9.  cd ext/mssql

10. phpize

11. ./configure Р-with-mssql=/usr/local/freetds

12. make

13. php -i | grep extension_dir

14. ls {folder}/mssql.so

to check if mssql.so is there where it should be. {folder} should be the same as the result of command number 13

15. edit php.ini and add

extension=mssql.so

16. restart apache

17. cd /usr/local/freetds/etc

18. vi freetds.conf

add these :

[global]
#dump file = /tmp/freetds.log

[172.16.8.42]
host = 172.16.8.42
instance = WIN-KMLN76J5IFD
port = 1433
tds version = 8.0

[172.16.8.51]
host = 172.16.8.51
instance = WIN-VMJN77S5ISF
port = 1433
tds version = 8.0

 

and then save and exit. dump file is very useful for debugging in case freetds is not working. remove the # when you need to see freetds log. instance can be found at microsoft sql server management studio.

19. export TDSVER=8.0

20. export TDSPORT=1433

21. to make them loaded on boot time:

 vi /etc/rc.local

and add :

export TDSVER=8.0
export TDSPORT=1433

save and exit

22. testing server1 with tsql ( don’t forget to create user on server1 and server2 with enough privileges) :

/usr/local/freetds/bin/tsql -S 172.16.8.42 -p 1433 -U someuser

enter password. if you get these lines below, that means freetds is working from tsql:

Password:
locale is “en_US.UTF-8”
locale charset is “UTF-8”
using default charset “UTF-8”
1>

type quit to end session

23. do the same test for server2

24. testing with php script :

at documentroot of domain.com do vi mssqltest.php and add :

<?php

//testing server2
$conn = mssql_connect(“172.16.8.51”, “someuser”, “password”) or die(“Couldn’t connect to SQL Server”) ;
mssql_select_db( “dbname”, $conn );

//testing server1

//$conn = mssql_connect(“172.16.8.42”, “someuser”, “password”) or die(“Couldn’t connect to SQL Server”);

//mssql_select_db( “dbname”, $conn );

$query_result = mssql_query( “SELECT filedname FROM tablename”, $conn );
echo “The field number one is: “;
echo mssql_result ($query_result, 0, 0);
mssql_close($conn); // close connection
?>

25. from browser go to http://domain.com/mssqltest.php and you should see some characters after The field number one is: