在套接字连接中添加客户端证书

时间:2015-12-20 15:47:35

标签: php sockets ssl

自从过去几天以来我一直坚持这个问题,但无法得到任何解决方案。

我正在使用net php-epp客户端,这是我的代码......

$context = stream_context_create(
    array(
        'ssl'=>array(
            'local_cert'=> dirname(__FILE__).'/cert.pem',
            'passphrase' => dirname(__FILE__).'/key.pem',
        )
    )
);

$greeting = $client->connect($host, $port, $timeout, $ssl, $context);
echo $greeting;

我收到以下错误...

Warning: stream_socket_client(): Unable to set private key file

在您key.pem开头-----BEGIN RSA PRIVATE KEY-----cert.pem-----BEGIN CERTIFICATE-----

开头之前

但是我可以使用...

连接
openssl s_client -connect epp.dom.net:700 -key key.pem -cert cert.pem -CApath /etc/ssl/certs/

此命令显示已连接,这是否意味着我的证书没问题?

有人帮我解决这个问题。请

谢谢。

1 个答案:

答案 0 :(得分:1)

根据PHP documentation,必须在local_pk流上下文选项中指定私钥。当私钥文件本身使用密码加密时,passphrase选项(您当前正在使用)是必需的:

  

local_pk字符串

     

在证书(local_cert)和私钥的单独文件的情况下,文件系统上的本地私钥文件的路径。

     

passphrase字符串

     

用于编码local_cert文件的密码短语。

这意味着你的流上下文应该像这样初始化:

$context = stream_context_create(array(
    'ssl' => array(
        'local_cert' => dirname(__FILE__) . '/cert.pem',
        'local_pk' => dirname(__FILE__) . '/key.pem',
    )
));

或者,您也可以将证书和私钥连接到一个文件中,并仅使用local_cert选项(如果 - 并且仅当 - 您的私钥使用加密时加passphrase选项密码)。