PHP与Mysql的Mysql连接无法正常运行PDO

时间:2017-07-13 21:07:15

标签: php mysql ssl php-7

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。

5 个答案:

答案 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)
     

MySQL documentation

但是,这只是让我感到困惑。默认情况下,PHP启用了VERIFY_IDENTITY,它要求主机名与通用名匹配。

这可以满足所有要求:

CA:指定一个唯一的名称。可以是任何东西。我只是在root.之前加上我的FQDN。

客户端和服务器:分配MySQL服务器的FQDN。 这两个值必须匹配。

如果客户端和服务器之间的FQDN不匹配,则VERIFY_IDENTITY将失败。

如果ca,客户端和服务器之间的FQDN确实匹配,则PHP中的OpenSSL将按照MySQL文档中的承诺失败。