【问题标题】:Add client certificate in socket connection在套接字连接中添加客户端证书
【发布时间】:2016-03-26 18:19:37
【问题描述】:

从最近几天开始,我一直被这个问题困扰,但找不到任何解决方案。

我正在使用 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/

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

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

谢谢。

【问题讨论】:

    标签: php sockets ssl


    【解决方案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 选项,如果 -- 且仅当 -- 您的私钥使用密码加密)。

    【讨论】:

    • 谢谢 helmbert,你是个了不起的人。非常感谢。我太高兴了。节日快乐,你有空做一些小项目吗?
    • 有什么联系方式/邮箱吗?
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2012-03-27
    • 2012-08-25
    • 2021-12-22
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多