Mysql服务器正在运行php5.3。新的webserver正在运行php7.1(从php5.3迁移)。当我尝试将mysql服务器与ssl连接时,它无法正常工作。
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_SSL_KEY => '/etc/mysql/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => '/etc/mysql/ca-cert.pem')
);
echo "Connestion established";
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
连接失败:SQLSTATE [HY000] [2002]
PDO :: __ construct():SSL操作失败,代码为1. OpenSSL错误消息: 错误:1416F086:SSL例程:tls_process_server_certificate:证书验证失败
但是,当我从连接中删除SSL块时,它的工作正常。我不知道发生了什么事。可能是服务器和客户端的版本不匹配。我正在使用旧的公钥和私钥。
是不是因为mysql客户端和服务器版本不匹配?
PS:我已经在网络服务器中升级了php7。
答案 0 :(得分:2)
因此,在搜索和阅读之后,我认为问题是由于SSL处理已经从PHP 5.6批准,并且默认情况下对等验证现已开启。
虽然以下不是关于mysql,但关于fsock,我认为这篇文章回答了你的问题: https://stackoverflow.com/a/32366242/2459026
您可以禁用对等验证(这通常不是一个好主意)或修复您的根证书。 我认为通过禁用同行验证进行测试可以确保这确实是你的问题。
(请注意,我在上一个答案旁边添加了第二个答案。这不是您问题的答案,但仍然可能与其他人相关或不相关)
答案 1 :(得分:1)
您说您“将SSL密钥从一台服务器复制到另一台服务器”。那么有一台新服务器?新服务器具有新标识,因此远程服务器将拒绝证书,因为ID不匹配。
我认为您应该首先从“known_hosts”文件中删除远程服务器上的行。 然后在您的Nginx服务器上,您应该使用这些SSH密钥手动连接到远程服务器并进行一次连接,以便将新标识添加到known_hosts。
之后我认为它应该有用。
即使以上操作不起作用,我认为最好通过手动连接到远程主机来调试此问题。当它工作时,您可以尝试设置mysql连接。
答案 2 :(得分:1)
您可以生成新的SSL证书,并确保使用正确的“通用名称”:
CA: hostname
Server: FQDN, e.g. hostname.example.com
Client: somename
重要的部分是服务器证书,其中公共名称必须与您要连接的主机相同,例如, hostname.example.com。
答案 3 :(得分:0)
您需要生成新的SSL证书并在服务器上测试端点以确保其正常工作。你应该没有问题。我建议使用Let's Encrypt:它是免费的,开放的,并且受到高度支持。请务必按照here后记的说明进行操作。
答案 4 :(得分:0)
通过一些试验和错误,我能够在不禁用对等验证的情况下解决此问题,部分原因在于MySQL文档:
重要
使用哪种方法生成证书和密钥 文件,用于服务器和客户端的通用名称值 证书/密钥必须分别与用于 CA证书。否则,证书和密钥文件将不会 适用于使用OpenSSL编译的服务器。在这种情况下的典型错误 是:
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
但是,这只是让我感到困惑。默认情况下,PHP启用了VERIFY_IDENTITY
,它要求主机名与通用名匹配。
这可以满足所有要求:
CA:指定一个唯一的名称。可以是任何东西。我只是在root.
之前加上我的FQDN。
客户端和服务器:分配MySQL服务器的FQDN。 这两个值必须匹配。
如果客户端和服务器之间的FQDN不匹配,则VERIFY_IDENTITY
将失败。
如果ca,客户端和服务器之间的FQDN确实匹配,则PHP中的OpenSSL将按照MySQL文档中的承诺失败。