cURL 无法在本地服务器中使用客户端证书
Posted
技术标签:
【中文标题】cURL 无法在本地服务器中使用客户端证书【英文标题】:cURL is unable to use client certificate , in local server 【发布时间】:2013-01-06 08:55:55 【问题描述】:我使用 XAMPP 设置了本地服务器。我有两个 php 脚本,一个发送者和一个接收者。我正在尝试使用 HTTP over SSL (HTTPS) 将 XML 文件从发送方发送到接收方。
我创建了一个自签名证书,配置了 XAMPP,并且我在我的发件人上使用了这个代码:
<?php
/*
* XML Sender/Client.
*/
// Get our XML. You can declare it here or even load a file.
$xml = file_get_contents("data.xml");
// We send XML via CURL using POST with a http header of text/xml.
$ch = curl_init();
//curl_setopt($ch, CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'ipm.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'ipm.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'pass');
//i use this line only for debugging through fiddler. Must delete after done with debugging.
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8888');
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "https://ipv4.fiddler/iPM/receiver.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_REFERER, 'https://ipv4.fiddler/iPM/receiver.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ch_result = curl_exec($ch);
echo "Result = ".$ch_result;
echo 'Curl error: ' . curl_error($ch);
curl_close($ch);
// Print CURL result.
?>
但是我总是收到这个错误:Curl error: unable to use client certificate (no key found or wrong pass phrase?)
我可能会做错什么?密码是pass
这个词。
我通过以下方式创建了我的 .crt:
openssl req -config openssl.cnf -new -out ipm.csr -keyout ipm.pem
openssl rsa -in ipm.pem -out ipm.key
openssl x509 -in ipm.csr -out ipm.crt -req -signkey ipm.key -days 365
我不想将 SSL_VERIFYPEER
和 SSL_VERIFYHOST
设置为 false。
【问题讨论】:
【参考方案1】:尝试像这样交换文件:
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'ipm.pem');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'ipm.crt');
我怀疑你把它们弄错了。
【讨论】:
【参考方案2】:我认为你已经解决了你的问题,但我可以看到两个问题:
-
你忘了
getcwd()
和filename
之间的斜线:curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/ipm.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/ipm.pem');
您需要附加一个密钥文件,正如@donparalias
已经说过的那样
【讨论】:
【参考方案3】:密钥必须是文件名,而不是密码。
【讨论】:
所以我应该把 .key 路径放在那里?你确定吗?我已经看过这个代码一百万次了,而且总是有密码……但我现在就试试 php.net/manual/en/function.curl-setopt.php 实际上说的是“文件名”。 仍然出现同样的错误,但我在很多这样的教程中都看到过。 我看到你没有设置 CURLOPT_SSLKEY。那应该是密钥文件名,您对证书密码是正确的。 你的意思是这样做: curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'pass'); curl_setopt($ch, CURLOPT_SSLKEYPASSWD, getcwd().'/ipm.key');尝试了同样的错误..以上是关于cURL 无法在本地服务器中使用客户端证书的主要内容,如果未能解决你的问题,请参考以下文章
Guzzle Curl 错误 60 SSL 无法获取本地发行者
Paypal Access - SSL 证书:无法获取本地颁发者证书
Paypal Access - SSL 证书:无法获取本地颁发者证书