PHP CURL和SSL证书(或证书链)

时间:2011-08-20 06:54:41

标签: php ssl curl https

美好的一天!

我有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

欢迎任何想法!

3 个答案:

答案 0 :(得分:2)

Curl在服务器上的一个单独位置使用CA证书,而不是系统的其他部分,就像桌面一样。我之前必须将CA证书安装到文件系统中。 PHP libcurl也将使用命令行实用程序使用的库。请参阅http://curl.haxx.se/docs/sslcerts.html

答案 1 :(得分:2)

几年前,Vkontakte从vkontakte.ru域名转移到了vk.com。他们也改变了他们的api处理程序URL。 这是我的解决方案:

  1. 在firefox中打开https://vk.com/
  2. 将证书链导出为此站点的X.509
  3. 将目标网址从http://api.vkontakte.ru更改为https://api.vk.com/
  4. 这是我的卷曲选项代码:

    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)

这些步骤似乎有效:

  1. 访问firefox中的https网址
  2. 点击绿色栏,点击箭头,然后点击&#34;更多信息&#34;
  3. 点击&#34;查看证书&#34;然后点击&#34;详细信息&#34;顶部的标签
  4. 然后点击每个级别并导出每个证书:

    根CA

    服务器CA

    示例-website.invalid

    您应该将所有三个文件保存到您的计算机上。将所有三个文件复制到一个文件中,例如custom_name_cert.pem

  5. 将该pem文件复制到可通过PHP访问的目录中,理想情况下该文件具有权限644.您甚至可以使用444来防止篡改,并在需要更新时将其更改为644.

    然后更新代码中的路径,例如:

    CURLOPT_CAINFO => '/var/www/certs/custom_name_cert.pem'

    警告:当网站更新其SSL证书时,上述文件可能会过期,并且HTTPS cURL调用可能会失败,从而破坏您的应用程序。希望有人会在这里回答一个自动更新此文件的好方法。