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


Add client certificate in socket connection

自从过去几天以来,我一直在处理这个问题,但没有得到任何解决方案。

我使用的是netphp-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/

这个命令显示已连接,所以这是否意味着我的证书可以?

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

谢谢。

根据PHP文档,私钥必须在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选项)。