2017-07-20 100 views
2

我有一個遠程MySQL服務器,需要我使用SSL進行連接。我可以使用我的終端連接到它。但是,當我嘗試連接它使用PHP,我得到以下錯誤:PHP到MySQL使用SSL

SSL3_GET_RECORD:wrong version number 

看起來OpenSSL的握手失敗,原因可能是我的PHP嘗試使用SSL3連接到它。 MySQL服務器僅支持TLSv1.2。有沒有辦法強制PHP使用TLSv1.2進行連接?

下面是用於連接我的代碼:

<?php 

ini_set ('error_reporting', E_ALL); 
ini_set ('display_errors', '1'); 
error_reporting (E_ALL|E_STRICT); 

$db = mysqli_init(); 
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); 

$db->ssl_set(NULL, NULL, '/path/to/ca-cert.pem' , NULL, NULL); 
$link = mysqli_real_connect ($db, 'hostname', 'user', 'password', 'dbname', 3306, NULL, MYSQLI_CLIENT_SSL); 
if (!$link) 
{ 
    die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\n"); 
} else { 
    $res = $db->query('SHOW TABLES;'); 
    print_r ($res); 
    $db->close(); 
}  
?> 

事情我已經嘗試和可能出現的問題:

  1. 好像OpenSSL的版本不匹配。我可以連接使用我的終端,而不是PHP,所以我在終端使用phpinfo()來檢查我的openssl版本,它們是一樣的
  2. PHP可能使用SSL3連接,並且服務器僅支持TLSv1 .2,我無法找到強制使用TLSv1.2連接MySQL的PHP​​方法。
  3. 我試圖使用tcpdump/Wireshark觀察握手,但我不認爲這個過程甚至開始,因爲有一個版本不匹配。
  4. 我確認使用「openssl s_client -debug」,服務器不支持SSL3,這讓我覺得這是我的電腦上的問題,但不知道。
  5. 我說我的客戶端可能使用SSL3的原因是因爲SSL3_GET_RECORD,我不確定我是否也適用。

所以,總之,幫助!

環境:

PHP 7.0.18

的MySQL Server Enterprise版本5.7.18

的OpenSSL 1.0.2g

操作系統:Windows 7,Ubuntu的16.04。試圖在兩個

+0

https://stackoverflow.com/questions/39330686/how-to-fix-mysqlireal-connect-ssl-operation-failed-error –

+0

https://stackoverflow.com/questions/ 26182346/error-on-pdo-ssl-connection –

+0

@IlyaBursov:兩個答案都不適用於我。 – Silencer310

回答

0

問題是PHP用來連接到MySQL的驅動程序。默認情況下,它是mysqlnd。我不認爲它能夠使用SHA256或更好的密碼連接到我的MySQL服務器,這是一個企業版本。

驅動程序的其他選項是Oracle提供的libmysql庫,作爲MySQL企業服務器(.deb文件)的一部分。我從一個乾淨的操作系統(Ubuntu)開始,並使用Oracle提供的libmysql編譯PHP,然後我能夠成功建立連接!

更多信息here