如何解决错误“无法加载 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”?的主要内容,如果未能解决你的问题,请参考以下文章

"SQL SERVER,错误:207" 如何解决

如何解决“错误:输入中的语法错误(1)。”

如何解决此分段错误:以下代码的 11 错误?

如何解决子重复错误?

Ftp 错误代码 550,如何解决

这是啥覆盖错误,我该如何解决? [复制]