无法在Google Compute上使用带有PDO的SSL连接到Google Cloud MySQL

时间:2016-02-19 23:06:50

标签: mysql ssl pdo google-compute-engine

刚想出来并希望分享。

我能够使用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:错误的其他签名确认'

2 个答案:

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