PHP到MySQL使用SSL
问题描述:
我有一个远程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();
}
?>
事情我已经尝试和可能出现的问题:
- 好像OpenSSL的版本不匹配。我可以连接使用我的终端,而不是PHP,所以我在终端使用phpinfo()来检查我的openssl版本,它们是一样的
- PHP可能使用SSL3连接,并且服务器仅支持TLSv1 .2,我无法找到强制使用TLSv1.2连接MySQL的PHP方法。
- 我试图使用tcpdump/Wireshark观察握手,但我不认为这个过程甚至开始,因为有一个版本不匹配。
- 我确认使用“openssl s_client -debug”,服务器不支持SSL3,这让我觉得这是我的电脑上的问题,但不知道。
- 我说我的客户端可能使用SSL3的原因是因为SSL3_GET_RECORD,我不确定我是否也适用。
所以,总之,帮助!
环境:
PHP 7.0.18
的MySQL Server Enterprise版本5.7.18
的OpenSSL 1.0.2g
操作系统:Windows 7,Ubuntu的16.04。试图在两个
答
问题是PHP用来连接到MySQL的驱动程序。默认情况下,它是mysqlnd。我不认为它能够使用SHA256或更好的密码连接到我的MySQL服务器,这是一个企业版本。
驱动程序的其他选项是Oracle提供的libmysql库,作为MySQL企业服务器(.deb文件)的一部分。我从一个干净的操作系统(Ubuntu)开始,并使用Oracle提供的libmysql编译PHP,然后我能够成功建立连接!
更多信息here
https://*.com/questions/39330686/how-to-fix-mysqlireal-connect-ssl-operation-failed-error –
https://*.com/questions/ 26182346/error-on-pdo-ssl-connection –
@IlyaBursov:两个答案都不适用于我。 – Silencer310