3

我有 2 个 php 脚本,用于发送一个 xml 文件并捕获它。我正在使用 cURL,一切正常。现在我正在尝试做同样的事情,但使用 HTTP over SSL (HTTPS)。我已经用 XAMPP 安装了本地服务器,并且我已经按照这篇文章设置了 SSL:在本地 xampp/apache 服务器上设置 SSL

我正在尝试像这样发送 xml 文件:

<?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_SSL_VERIFYPEER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
  curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");

  //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;
  curl_close($ch);
  // Print CURL result.
?>

我从这里下载了 cURL 的新证书:

http://curl.haxx.se/ca/cacert.pem

我不确定我应该把证书放在哪里,但我把它放在我这个项目的工作区目录中。

现在的问题是 XML 文件永远不会发送到接收方。有任何想法吗?

4

2 回答 2

7

cacert.pem您通过 传递给 cURL 的用于CURLOPT_CAINFO验证证书颁发机构,但开发服务器通常具有不包含在该捆绑包中的自签名证书。

第一步是生成您自己的自签名证书。本文将逐步介绍该过程。确保在生成 CSR 期间,您使用的是 . 下的预期服务器名称Common Name (CN),例如ipv4.fiddler.

一旦您使用自签名证书(例如server.crt)和密钥(例如server.key)配置了您的 Web 服务器,您需要将前者复制到您的脚本可以访问它的位置。

以下基本要素可用于验证整个事情:

$ch = curl_init('https://ipv4.fidler');
curl_setopt_array($ch, array(
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_VERBOSE => true,
    CURLOPT_CAINFO => '/path/to/server.crt',
));

if (false === curl_exec($ch)) {
    echo "Error while loading page: ", curl_error($ch), "\n";
}
于 2013-01-22T02:14:03.437 回答
2

如果我想使用 发送ssl发布请求Curl,而不验证证书,则可以使用以下代码:

$data = array(
    'name' => $name,
    'ip' => $ip,
    'text'=> "text"
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,'https://myserver.com/index.php/');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
          http_build_query($data));

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
curl_close ($ch);
于 2016-10-12T15:43:01.830 回答