PDO具有自签名证书

时间:2016-01-05 23:08:14

标签: php mysql ssl pdo

我仍在尝试将PDO连接到远程MySQL数据库。客户提供自签名证书client-key.pemclient-cert.pem。证书很好,我可以使用mysql客户端连接到远程数据库。 这是我实例化一个PDO对象以连接到db。

pdoDb = new PDO(
  'mysql:host=customer_host_name;dbname=customer_db_name', 
  'my_username', 
  'my_password', 
  array(
   PDO::MYSQL_ATTR_SSL_KEY=>'C:/Apache24/htdocs/CLIENT/lib/client-key.pem',
   PDO::MYSQL_ATTR_SSL_CERT=>'C:/Apache24/htdocs/CLIENT/lib/client-cert.pem'
  ));

我在实例化PDO对象时收到此错误:

Warning: PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in C:\Apache24\htdocs\CUSTOMER\lib\database.php on line 17

我认为代码是正确的,但我是PHP的新手。

更新 对不起。我忘了提到我没有指定MYSQL_ATTR_SSL_CA的值,因为客户不给我一个。抱歉。 MYSQL_ATTR_SSL_CA(或PDO)必须mysqli吗?

1 个答案:

答案 0 :(得分:2)

生成证书时,您必须为每个证书使用正确的“公共名称”:

CA: hostname 
Server: FQDN, e.g. hostname.example.com 
Client: somename

重要的部分是服务器证书,其中公共名称必须与您要连接的主机相同,例如, hostname.example.com。

$pdoDb = new PDO(
  'mysql:host=customer_host_name;dbname=customer_db_name', 
  'my_username', 
  'my_password', 
  array(
    PDO::MYSQL_ATTR_SSL_KEY    => 'C:/Apache24/htdocs/CLIENT/lib/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT   => 'C:/Apache24/htdocs/CLIENT/lib/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA     => 'C:/Apache24/htdocs/CLIENT/lib/ca-cert.pem',
    PDO::MYSQL_ATTR_SSL_CIPHER => 'CAMELLIA128-SHA'
  )
);