【发布时间】: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 文件。我的猜测是该文件包含证书和密钥。 stackoverflow.com/a/15144560/254234 这是之后在 CURLOPT_SSLCERT 中加载的无效格式。 Windows/Linux 之间的区别可能在于您的托管服务提供商的错误日志和错误级别/显示错误不同。
-
我尝试了不同的方法,但显示相同的错误。
-
您是否尝试过以绝对方式定义 .pem 的路径?如果没有 .pem 文件的内容,调试此问题并不容易。但是通过显示 .pem 密钥,您可能会暴露您的密钥。
-
您也可以使用
openssl x509 -in myfile.pem -noout -text查看客户端证书 -
您可以验证您的 php curl 使用哪个路径来获取 pem 文件,也许这只是一个配置问题