如果这个问题很愚蠢,请问我,但是我是这个领域的新手。 我需要从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。
答案 0 :(得分:2)
要进行SSL验证,您需要使用pem格式的证书,它的关联私钥(openssl格式)和以pem格式签名的证书颁发机构的根证书。
检查此完整样本:
如果您没有得到通知,错误消息并不会很清楚,但它会指出:
无法加载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
文件中新文件夹的路径,并且它再次可以正常工作。