Php 具有自签名证书的PDO

Php 具有自签名证书的PDO,php,mysql,ssl,pdo,Php,Mysql,Ssl,Pdo,我还在尝试用PDO连接到一个远程MySQL数据库。客户提供自签名证书、client key.pem和client-cert.pem。证书很好,我可以使用mysql客户端连接到远程数据库。 这就是我实例化PDO对象以连接到db的地方 pdoDb = new PDO( 'mysql:host=customer_host_name;dbname=customer_db_name', 'my_username', 'my_password', array( PDO::MYSQ

我还在尝试用PDO连接到一个远程MySQL数据库。客户提供自签名证书、
client key.pem
client-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\u ATTR\u SSL\u CA
指定一个值,因为客户没有给我一个值。很抱歉
MYSQL\u ATTR\u SSL\u CA
PDO
(或
mysqli
)是强制性的吗?

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

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'
  )
);

您是否尝试在Internet上搜索错误消息?关于这一点有很多描述。到目前为止,您已经尝试了哪些,结果如何?您好,我看到您指定了一个
ca-cert.pem
。客户不向我提供密码,但只提供
客户端密钥
客户端证书
,它们足以连接到远程服务器。对PDO来说,
ca-cert.pem
是强制性的吗?弗兰兹,如果你问这个问题,我认为你真的不理解证书。CA证书仅用于信任目的,有助于处理多个证书。您是否有openssl php扩展,是否启用了它?是的,我取消了
扩展=php_openssl.dll
行的注释。正如Charles所暗示的,客户端上未安装签署服务器证书的CA证书