【问题标题】:Curl - cannot connect using p12 certificateCurl - 无法使用 p12 证书连接
【发布时间】:2014-08-13 08:08:45
【问题描述】:

我正在尝试使用Curl 收集一些数据,连接到一些外部公司提供的服务。除了地址本身之外,他们还向我发送了建立连接所需的 p12 证书文件。

当我尝试将它与 curl 一起使用时,我收到以下错误:

#58: not supported file type 'P12' for certificate

到目前为止,我已经尝试更新 curl 和 php-curl。没有任何改变。

我的代码:

...
curl_setopt($ch, CURLOPT_SSLCERT, 'cert_path');
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'P12');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'my_pass');
...

有趣的是,这段代码可以在我们的生产环境中运行,而在我的本地机器(Linux Mint 16)上却无法运行。

【问题讨论】:

    标签: php curl ssl


    【解决方案1】:

    找到了解决办法。

    最简单的方法是从.p12 文件中提取.pem 密钥和证书。

    例如(在linux上测试):

    openssl pkcs12 -in file.p12 -out file.key.pem -nocerts -nodes
    openssl pkcs12 -in file.p12 -out file.crt.pem -clcerts -nokeys
    

    将在当前目录中创建密钥/证书对。

    现在,使用它:

    curl_setopt($ch, CURLOPT_SSLCERT, 'file.crt.pem');
    curl_setopt($ch, CURLOPT_SSLKEY, 'file.key.pem');
    curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'pass');
    curl_setopt($ch, CURLOPT_SSLKEYPASSWD, 'pass');
    

    其中pass 是来自.p12 文件的密码。

    【讨论】:

    • 这个答案并不完全正确。您不需要 2 个单独的文件。您的命令不会在您的文件上创建“传递”,因此它们不会被加密。只需使用 -clcerts 选项执行 1 个文件。
    • @imclickingmaniac 你能注意到你说的哪个命令会起作用吗?我不清楚。你是说只需要第二个命令吗?此外,curl_setopt 设置会发生什么变化?我用 .p12 文件和密码尝试了很多组合,但它们都在 ca 证书上给出错误,我就到这里了。
    • @SteveExdia 如果我没记错的话,这就是你需要的:openssl pkcs12 -in file.p12 -out file.crt.pem -clcerts。这是解释我如何(或多或少)使用 php 执行此操作的虚拟代码:sandbox.onlinephpfunctions.com/code/…
    • @SteveExdia 当我遇到与 p12 相同的问题时,您会在此处找到更多信息。这是使用 SOAP,但背后的想法是完全相同的。 stackoverflow.com/questions/49918241/…
    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2016-02-01
    • 2011-10-23
    • 2011-01-12
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多