如何解决错误“无法加载PEM客户端证书,OpenSSL错误:02001003:系统库:fopen:无此过程”?

时间:2018-10-13 16:36:30

标签: php curl openssl drupal-7

如果这个问题很愚蠢,请问我,但是我是这个领域的新手。 我需要从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共享主机上的客户端站点上执行此代码,而我的本地主机在Windows 7 64x上运行。执行该代码没有任何错误,但是curl_exec返回一个空字符串。

我想澄清一下,我做错了什么,为什么不想加载PEM客户端证书?我应该如何在本地主机上解决此问题? 我不能放弃使用Windows 7而是开始使用Linux。

3 个答案:

答案 0 :(得分:2)

要进行SSL验证,您需要使用pem格式的证书,它的关联私钥(openssl格式)和以pem格式签名的证书颁发机构的根证书。

检查此完整样本:

PHP:path of CURLOPT_SSLCERT

如果您没有得到通知,错误消息并不会很清楚,但它会指出:

  

无法加载PEM客户端证书,OpenSSL错误   错误:02001003:系统库:打开:没有这样的过程,(未找到密钥,   错误的密码短语或错误的文件格式?)

此致

答案 1 :(得分:0)

我敢打赌,如果将错误更改为

,该错误将更容易理解
$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()解决了最后一个问题)

答案 2 :(得分:0)

可能与您的特定问题无关,但是与任何其他收到此错误的人(例如,当推送到git存储库时)有关,这是在我移动了包含必要.pem文件的文件夹之后发生的。

==>我必须更新~/.gitconfig文件中新文件夹的路径,并且它再次可以正常工作。