2017-07-20 70 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