美好的一天!
我有REST API,可通过SSL(https://)访问。我想把正确的证书(或证书链)与我编写的PHP和CURL脚本一起提出请求。
以下是我的目标(http://api.vkontakte.ru)中的证书在Firefox中的外观:
http://speedcap.net/img/bc687485819715c65d6fe1e4ca1fdc40/1a2be.png
以下是Firefox保存的“PEM格式的证书链X.509”的片段 (在此描述:http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/):
-----BEGIN CERTIFICATE-----
MIIFVzCCBD+gAwIBAgIHKx5Ov2FOejANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
[..skip...]
0npsf5fkvT8E13NgVY0PK6V/baMTlTgWXKQZ
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
[..skip...]
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
U+4=
-----END CERTIFICATE-----
以下是CURL init的代码示例:
$this->ch = curl_init();
curl_setopt_array($this->ch, array(
CURLOPT_TIMEOUT => 30,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_AUTOREFERER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_SSL_VERIFYPEER => TRUE,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_CAINFO => <path to my cert>,
));
我的CURL错误60(CURLE_SSL_CACERT
)抱怨wron cert。
我尝试了什么:
我已经确认使用了我的证书文件,因为当我指定错误的路径时,它会抱怨它无法找到证书(错误70)
我已经使用Facebook SDK和他们的证书链检查了我的CURL是否可以使用这样的设置
我试图在链中导出不同的链(包括或排除)最后一个证书
尝试CURLOPT_SSL_VERIFYHOST => 1
。
欢迎任何想法!
答案 0 :(得分:2)
Curl在服务器上的一个单独位置使用CA证书,而不是系统的其他部分,就像桌面一样。我之前必须将CA证书安装到文件系统中。 PHP libcurl也将使用命令行实用程序使用的库。请参阅http://curl.haxx.se/docs/sslcerts.html。
答案 1 :(得分:2)
这是我的卷曲选项代码:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() ."/ffchainvk.crt"); // ok
ffchainvk.crt
是带导出证书链的文件。
答案 2 :(得分:-1)
这些步骤似乎有效:
然后点击每个级别并导出每个证书:
根CA
服务器CA 和
示例-website.invalid 强>
您应该将所有三个文件保存到您的计算机上。将所有三个文件复制到一个文件中,例如custom_name_cert.pem
将该pem文件复制到可通过PHP访问的目录中,理想情况下该文件具有权限644.您甚至可以使用444来防止篡改,并在需要更新时将其更改为644.
然后更新代码中的路径,例如:
CURLOPT_CAINFO => '/var/www/certs/custom_name_cert.pem'
警告:当网站更新其SSL证书时,上述文件可能会过期,并且HTTPS cURL调用可能会失败,从而破坏您的应用程序。希望有人会在这里回答一个自动更新此文件的好方法。