PHP:无法获取 PKCS12 文件和密码以使用 cURL

问题描述

在浏览了 cURL 的 PHP 文档,然后进行测试后,我遇到了一个一个错误,此时基本上是在 StackOverflow 漏洞中,并不断撞墙。我宁愿只告诉 PHP cURL 加密的 .p12 文件的路径及其密码,然后让它全部弄清楚并工作,但似乎每个 PEM 值都需要文件路径。也许我错过了什么。

我将函数 openssl_pkcs12_read 与 .p12 文件路径和密码一起使用,它创建了一个包含三个元素的数组 var:certspkeyextracerts,都在 PEM 中格式如下:

Array
(
    [cert] => -----BEGIN CERTIFICATE-----
ABC123...
-----END CERTIFICATE-----
    [pkey] => -----BEGIN PRIVATE KEY-----
DEF456...
-----END PRIVATE KEY-----
    [extracerts] => Array
        (
            [0] => -----BEGIN CERTIFICATE-----
GHI789...
-----END CERTIFICATE-----
        )
)

然后我使用函数 tmpfile() 将这些元素放入它们自己的临时文件中,该函数自动删除,并阻止我在本地保存未加密的 PEM 数据:

$p12certFile = tmpfile();
fwrite($p12certFile,$certificates['cert']);
fseek($p12certFile,0); // resets the read pointer
$p12keyFile = tmpfile();
fwrite($p12keyFile,$certificates['pkey']);
fseek($p12keyFile,0); // resets the read pointer
$p12extraCertsFile = tmpfile();
fwrite($p12extraCertsFile,implode("\n",$certificates['extracerts']));
fseek($p12extraCertsFile,0); // resets the read pointer

然后,根据我对文档和其他 StackOverflow 帖子的理解,我将临时文件路径或其内容传递给 PHP cURL opts,如下所示:

curl_setopt($ch,CURLOPT_SSLCERT,stream_get_Meta_data($p12certFile)['uri']);
curl_setopt($ch,CURLOPT_SSLCERTPASSWD,'the_p12_password');
//curl_setopt($ch,CURLOPT_SSLCERTTYPE,'P12'); // this when enabled gives a different error even with 'PEM'
curl_setopt($ch,CURLOPT_SSLKEY,stream_get_Meta_data($p12keyFile)['uri']);
curl_setopt($ch,CURLOPT_SSLKEYPASSWD,'the_p12_password'));
curl_setopt($ch,CURLOPT_CAINFO,stream_get_Meta_data($p12extraCertsFile)['uri']);
curl_setopt($ch,CURLOPT_CAPATH,CURLOPT_SSL_VERIFYPEER,true); // no error difference enabled or disabled

即使我禁用了 PASSWD 行,由于某种原因也无法加载密钥文件

我可以尝试将文件保存为他们自己的非临时文件,但我不想这样做(跨服务器的多人需要做更多的工作,而且我不知道密码的意义是什么,如果我们将未加密的私钥保存在服务器上)。

无论如何,我还没有找到包含 'cert'、'pkey' 和 'extracerts' 值的 .p12 密码文件的指令集,所以我不知道我是否需要成为 PKCS #12 + PHP + cURL 专家才能让它发挥作用。

PS 我正在使用 PHP 7.3 的 Mac 上对此进行测试,服务器是运行 PHP 5-7 的 Linux(与 TLSv1.2 兼容,别担心)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)