我们有一个在端口 3306 上带有 mysql 的服务器。我们有证书和密钥,并且我们尝试连接到该服务器。但我们看到这样的问题:
对等证书 CN='SomeName' 与预期的 CN='someIP' 不匹配
我读了很多文章,但找不到 PDO PHP 的答案。最有趣的是 SQLYog 可以连接所有设置。
我读到可以禁用 verify_peer_names (我希望我了解什么是peer_names...),但前提是我们使用 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 和连接设置,使其适用于我们的内部自签名证书。
So, put 'dbServer1.company.local'
作为服务器证书的 CN 并使用相同的'dbServer1.company.local'
地址作为 PDO 连接的 DSN 的主机部分。如果你喜欢,你可以直接使用'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
不是问题,但如果您的网络服务器无法解决您的问题,或者您不/无法管理 DNS 条目,则可以对您的服务器进行如下攻击:etc/hosts
file:
10.5.5.20 dbServer1.company.local
or
10.5.5.20 dbServer1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)