如果这个问题很愚蠢,请原谅我,但我是这方面的新手。 我需要通过 SSL 从 Drupal 7 站点连接到服务。我有一个扩展名为".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返回一个 void 字符串。
我想澄清一下,我做错了什么以及为什么 PEM 客户端证书不想加载?我应该在我的本地主机上做什么来解决这个问题? 我不能放弃使用Windows 7并开始使用Linux。
对于 SSL 验证,您需要 pem 格式的证书,它是关联的私钥(openssl 格式(和以 pem 格式签署证书的证书权威机构的根证书。
检查此完整示例:
PHP:CURLOPT_SSLCERT路径
如果您没有收到通知,错误消息不是很清楚,但它说:
无法加载 PEM 客户端证书,OpenSSL 错误 错误:02001003:系统库:fopen:没有这样的进程,(找不到密钥, 错误的密码短语,或错误的文件格式?
问候
我敢打赌,如果您将其更改为错误,该错误将更容易理解
$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);
.. 很可能 PEM 文件无法被运行 PHP 的帐户读取(例如,如果您以 root 身份创建文件并且所有者是 root:root 并且权限a-r
并且 PHP 在帐户下运行www-data
(,另一种解释是该文件不存在 - 另一种解释是您在运行 curl_exec(( 之前运行 chdir((, 而且由于您使用的是相对文件路径,因此在运行 curl_exec(( 时相对路径不再有效(但使用 realpath((,就像我上面所做的那样,解决了最后一个问题(