如何解决错误“无法加载 PEM 客户端证书,OpenSSL 错误:02001003:system library:fopen:No such process”?
Posted
技术标签:
【中文标题】如何解决错误“无法加载 PEM 客户端证书,OpenSSL 错误:02001003:system library:fopen:No such process”?【英文标题】:How to solve the error "could not load PEM client certificate, OpenSSL error:02001003:system library:fopen:No such process"? 【发布时间】:2019-03-18 14:26:13 【问题描述】:如果这个问题很愚蠢,请原谅,但我是这方面的新手。 我需要从 Drupal 7 站点通过 SSL 连接到服务。我有一个带有“.p12”扩展名的文件和一个密码。另外,我使用 php 7.1 1 和 Windows 7 64x。 我使用以下命令将 .p12 文件转换为 .pem 文件。
openssl pkcs12 -in myfile.p12 -out myfile.pem
在我将 Openssl 安装到我的计算机中并将路径添加到 Windows 之前。 之后,我尝试使用以下代码使用 CURL 函数连接到服务器。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'my_addr');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSLCERT, 'myfile.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'mypsw');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
if ($result === FALSE)
$curl_error = curl_error($ch);
curl_close($ch);
不幸的是,curl_exec 返回 FALSE,而 curl_error 返回以下内容:
could not load PEM client certificate, OpenSSL error error:02001003:system library:fopen:No such process, (no key found, wrong pass phrase, or wrong file format?)
我决定在 Linux 共享主机上的客户端站点上执行此代码,而我的 localhost 在 Windows 7 64x 上运行。代码执行没有任何错误,但 curl_exec 返回一个空字符串。
我想澄清一下,我做错了什么以及为什么不想加载 PEM 客户端证书?我应该在本地主机上做什么来解决这个问题? 我不能放弃使用 Windows 7 而开始使用 Linux。
【问题讨论】:
您是否尝试过查看 .pem 文件。我的猜测是该文件包含证书和密钥。 ***.com/a/15144560/254234 这是之后在 CURLOPT_SSLCERT 中加载的无效格式。 Windows/Linux 之间的区别可能在于您的托管服务提供商的错误日志和错误级别/显示错误不同。 我尝试了不同的方法,但显示相同的错误。 您是否尝试过以绝对方式定义 .pem 的路径?如果没有 .pem 文件的内容,调试此问题并不容易。但是通过显示 .pem 密钥,您可能会暴露您的密钥。 您也可以使用openssl x509 -in myfile.pem -noout -text
查看客户端证书
您可以验证您的 php curl 使用哪个路径来获取 pem 文件,也许这只是一个配置问题
【参考方案1】:
对于 SSL 验证,您需要一个 pem 格式的证书,它是相关的私钥(openssl 格式)和签署您的 pem 格式证书的认证机构的根证书。
检查此完整示例:
PHP:path of CURLOPT_SSLCERT
如果你没有被告知,错误信息不是很清楚,但它说:
无法加载 PEM 客户端证书,OpenSSL 错误 error:02001003:system library:fopen:No such process, (no key found, 密码错误或文件格式错误?)
问候,
【讨论】:
【参考方案2】:我敢打赌,如果你把它改成这个错误会更容易理解
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'my_addr');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
$pem=realpath("myfile.pem");
if(!$pem || !is_readable($pem))
die("error: myfile.pem is not readable! realpath: \"$pem\" - working dir: \"".getcwd()."\" effective user: ".print_r(posix_getpwuid(posix_geteuid()),true));
curl_setopt($ch, CURLOPT_SSLCERT, $pem);
.. 运行 php 的帐户很可能无法读取 pem 文件(例如,如果您以 root 身份创建文件并且所有者是 root:root 并且权限是 a-r
并且 php 在帐户www-data
),另一种解释是该文件不存在 - 另一种解释是您在运行 curl_exec() 之前运行 chdir(),并且由于您使用的是相对文件路径,因此相对路径是运行 curl_exec() 时不再有效(但使用 realpath(),就像我上面所做的那样,解决了最后一个问题)
【讨论】:
以上是关于如何解决错误“无法加载 PEM 客户端证书,OpenSSL 错误:02001003:system library:fopen:No such process”?的主要内容,如果未能解决你的问题,请参考以下文章