如何将自签名证书与 XAMPP 一起用于使用 cURL 的 HTTPS 请求?
Posted
技术标签:
【中文标题】如何将自签名证书与 XAMPP 一起用于使用 cURL 的 HTTPS 请求?【英文标题】:How to use a self signed certificate with XAMPP for HTTPS requests using cURL? 【发布时间】:2013-01-05 05:01:51 【问题描述】:我安装了 XAMPP,我需要测试一些 HTTPS 请求。首先,我尝试配置 XAMPP,以便可以使用 HTTPS 请求。
这就是我所做的:
1) 在 php.ini 文件中,我取消了 openssl module
的注释。
2) 在 httpd.conf 文件中,我取消了 LoadModule ssl_module modules/mod_ssl.so
的注释
3) 在 httpd-ssl.conf 文件中,我重定向了
SSLCertificateFile "conf/ssl.crt/ipm.crt"
和
SSLCertificateKeyFile "conf/ssl.key/ipm.key
" 到我的 .crt 和 .key 文件。
4) 我将 ipm.crt 和 ipm.key 文件放在 XAMPP 内的 apache 文件夹 ssl.crt
和 ssl.key
中。
5) 我通过以下方式创建了我的自签名证书:
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
现在我正在使用一个脚本来发送一个 XML 文件。我正在使用 cURL,我的代码是:
<?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, getcwd().'/cert/ipm.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/ipm.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD,'password');
//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?)
但是,当我创建证书时,我确实将以下短语作为密码:password
对此事有什么想法吗?
【问题讨论】:
【参考方案1】:相信你还需要指定CURLOPT_SSLKEYPASSWD
:
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, 'password');
【讨论】:
您确定密码正确吗?试试这个:openssl rsa -in ipm.key。它会提示您输入密码。 它给了我: -----BEGIN RSA PRIVATE KEY----- 许多字符,如编码 -----END RSA PRIVATE KEY--- -- 它没有提示我做某事 如果从脚本中删除 CURLOPT_SSLCERTPASSWD 和 CURLOPT_SSLKEYPASSWD 会发生什么? 我再次遇到同样的错误,但我想我知道问题出在哪里。当我使用它时: curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cert/ipm.crt'); curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/ipm.pem');首先这些是正确的吗?我不记得我在哪里读到这样写的。其次,他们到底指向哪里?我将我的证书放在我的项目工作区中一个名为 cert 的文件夹中。可能路径错了? 因为在 CURLOPT_CAINFO 我使用 .crt 而在 CURLOPT_SSLCERT 我使用 pem。这似乎有点奇怪?以上是关于如何将自签名证书与 XAMPP 一起用于使用 cURL 的 HTTPS 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何将自签名证书正确导入默认情况下可供所有 Java 应用程序使用的 Java 密钥库?
如何将自签名证书分配给 AWS 弹性 beantalk 应用程序