我有一个远程 MySQL 服务器,需要使用 SSL 进行连接。我可以使用终端连接到它。但是当我尝试使用 PHP 连接到它时,出现以下错误:
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 进行连接,因此我在终端中检查了我的 openssl 版本,并使用 phpinfo() 获得了该版本,它们是相同的
- PHP 可能使用 SSL3 进行连接,并且服务器仅支持 TLSv1.2,我无法找到强制使用 TLSv1.2 连接 PHP 到 MySQL 的方法
- 我尝试使用 tcpdump/Wireshark 观察握手,但由于版本不匹配,我认为该过程甚至没有启动。
- 我使用“openssl s_client -debug”确认服务器不支持 SSL3,这让我认为这是我的计算机上的问题,但不确定。
- 我说我的客户端可能使用 SSL3 的原因是因为 SSL3_GET_RECORD,我也不确定我是否正确。
因此,简而言之,救命!