Php cURL无法在本地服务器中使用客户端证书

Php cURL无法在本地服务器中使用客户端证书,php,curl,https,xampp,ssl-certificate,Php,Curl,Https,Xampp,Ssl Certificate,我使用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_co

我使用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.
?>

我不想将SSL\u VERIFYPEER和SSL\u VERIFYHOST设置为false。

密钥必须是文件名,而不是密码短语。

密钥必须是文件名,而不是密码短语。

我认为您已经解决了问题,但我可以看到两个问题:

您忘记了getcwd和filename之间的斜杠: curl_setopt$ch,CURLOPT_CAINFO,getcwd'/ipm.crt'; curl_setopt$ch,CURLOPT_SSLCERT,getcwd'/ipm.pem'; 您需要像@donparalias所说的那样附加一个密钥文件
我认为你已经解决了你的问题,但我可以看到两个问题:

您忘记了getcwd和filename之间的斜杠: curl_setopt$ch,CURLOPT_CAINFO,getcwd'/ipm.crt'; curl_setopt$ch,CURLOPT_SSLCERT,getcwd'/ipm.pem'; 您需要像@donparalias所说的那样附加一个密钥文件
尝试像这样交换文件:

curl_setopt($ch, CURLOPT_CAINFO, getcwd().'ipm.pem');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'ipm.crt');

我怀疑你搞错了。

试着像这样交换你的文件:

curl_setopt($ch, CURLOPT_CAINFO, getcwd().'ipm.pem');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'ipm.crt');

我怀疑你把它们弄错了。

所以我应该把.key路径放在那里?你确定吗?我已经看过这段代码一百万次了,密码短语总是有的。。但我现在会尝试它,它实际上是一个文件名。仍然会出现相同的错误,但我在很多类似的教程中都看到过。我发现您还没有设置CURLOPT_SSLKEY。这应该是关键文件名,关于证书密码你是对的;curl_setopt$ch,CURLOPT_SSLKEYPASSWD,getcwd'/ipm.key';尝试了相同的错误..所以我应该把.key路径放在那里?你确定吗?我已经看过这段代码一百万次了,密码短语总是有的。。但我现在会尝试它,它实际上是一个文件名。仍然会出现相同的错误,但我在很多类似的教程中都看到过。我发现您还没有设置CURLOPT_SSLKEY。这应该是关键文件名,关于证书密码你是对的;curl_setopt$ch,CURLOPT_SSLKEYPASSWD,getcwd'/ipm.key';我也犯了同样的错误。。