我们在3306端口上有一个带有mysql的服务器。我们有加密和密钥,我们试图连接到此服务器。但我们看到这样的问题:
对等证书CN='SomeName'与预期的CN='someIP'不匹配
我读了很多文章,但找不到PDO PHP的答案。最有趣的是SQLYog可以连接所有设置。
我已经读过我验证了可以禁用对等名称(我希望我理解什么是对等名称…),但前提是我们使用openssl{functions}或mysqli,而不是PDO。两种选择都不适合我。我需要PDO。
我想做的是:
在不同版本的php之间切换。它帮了我,但我需要5.6或更高。对于php 7.0同样的错误。
找到另一个版本的openssl和pdo;很快我就明白这是个坏主意:)
在php.ini中找到一些设置,但没有针对我的问题的设置,只用于创建ssl。
我的连接代码:

$dbInfo = array
(
'dsn' => 'mysql:host=123.45.67.890;dbname=someDB;port=3306',
'user' => 'user',
'pass' => 'userpassword'
);

$con = new PDO
    (
    $dbInfo['dsn'], $dbInfo['user'], $dbInfo['pass'],
    array(
        PDO::MYSQL_ATTR_SSL_CIPHER => 'AES256-SHA',
        PDO::MYSQL_ATTR_SSL_CA     => 'SSLCert/ca-cert.pem',
        PDO::MYSQL_ATTR_SSL_KEY    => 'SSLCert/client-key.pem',
        PDO::MYSQL_ATTR_SSL_CERT   => 'SSLCert/client-cert.pem',
    )
    );

echo 'Connection OK!';

最佳答案

我们不使用IP地址,而是使用计算机(+域名)作为CN和连接设置,从而使内部自签名证书能够正常工作。
因此,将'dbServer1.company.local'作为服务器证书的CN,并使用与PDO连接DSN的主机部分相同的'dbServer1.company.local'地址。如果您喜欢,可以使用'dbServer1',但要确保在两个地方都使用。
这会让你走:

$pdo_options = array(
    PDO::MYSQL_ATTR_SSL_KEY => 'path/to/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT => 'path/to/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA => 'path/to/ca.pem'
);

PDO::__construct('mysql:host=dbServer1.company.local;dbname=someDB','someUser', 'somePass', $pdo_options);

我们管理自己的DNS,因此解决dbServer1.company.local不是问题,但如果您的web服务器无法解决它,或者您没有/无法管理DNS条目,则侵入您的etc/hosts文件,如下所示:
10.5.5.20 dbServer1.company.local


10.5.5.20 dbServer1

关于mysql - php 5.x 7.x,ssl pdo错误:对等证书CN ='someName'与预期的CN ='someIP'不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38719607/

10-12 20:07