刚想出来并希望分享。
我能够使用SSL与本地计算机上的PHP PDO连接到MySQL。从Google Compute Engine实例运行时,相同的代码失败。我知道证书和IP地址设置正确,因为在实例上通过MySQL命令行客户端使用SSL进行连接可以很好地工作。
MySQL命令行适用于Compute:
mysql --ssl-ca = server-ca.pem --ssl-cert = client-cert.pem --ssl-key = client-key.pem \ --host = 111.111.111.111 --user = someuser --password
PHP PDO不适用于Compute:
<?php
new PDO ('mysql:host=111.111.111.111;port=3306;dbname=mydatabase',
'someuser',
'somepassword,
array(
PDO::MYSQL_ATTR_SSL_KEY => '/somedir/ssl/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/somedir/ssl/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => '/somedir/ssl/ca-cert.pem'
)
);
PDO在Compute上给出了这个错误:
PHP致命错误:未捕获异常'PDOException',消息'SQLSTATE [HY000] [2026] SSL连接错误:ASN:错误的其他签名确认'
答案 0 :(得分:0)
从PDO连接中删除CA证书。 从数组中删除此键/值:
PDO :: MYSQL_ATTR_SSL_CA =&gt; '/somedir/ssl/ca-cert.pem'
像这样:
<?php
new PDO ('mysql:host=111.111.111.111;port=3306;dbname=mydatabase',
'someuser',
'somepassword,
array(
PDO::MYSQL_ATTR_SSL_KEY => '/somedir/ssl/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/somedir/ssl/client-cert.pem'
)
);
使用SSL的PDO会在某些条件下以静默方式失败回到不安全的连接。要测试SSL是否正常运行,请在连接上运行此查询:
SHOW STATUS LIKE 'Ssl_cipher';
应该返回类似的内容:
Ssl_cipher => DHE-RSA-AES256-SHA
否则它将返回一个空值。
答案 1 :(得分:0)
只需在数组中再添加一个PDO属性(根据http://php.net/manual/en/ref.pdo-mysql.php中Desislav Kamenov的评论),以使您的PDO成为...
new PDO ('mysql:host=111.111.111.111;port=3306;dbname=mydatabase',
'someuser',
'somepassword',
array(
PDO::MYSQL_ATTR_SSL_KEY => '/somedir/ssl/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/somedir/ssl/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => '/somedir/ssl/ca-cert.pem',
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
)
);