2011-08-20 399 views
1

美好的一天!PHP CURL和SSL证书(或证书链)

我有可通过SSL(https://)访问的REST API。我想把正确的证书(或证书链)连同我的脚本写成PHP和CURL来提出请求。

下面是我的目标(http://api.vkontakte.ru)证书怎么看起来像在Firefox:

http://speedcap.net/img/bc687485819715c65d6fe1e4ca1fdc40/1a2be.png

这里是保存的“证书链X.509 PEM格式”从Firefox 片段(这里所描述: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初始化的代码例如:

$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和他们的证书链,我的工作卷曲这样的设置

  • 我试图导出不同的链(包括或不包括)的环比证书检查

  • 试过CURLOPT_SSL_VERIFYHOST => 1

欢迎任何想法!

回答

1

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

+0

谢谢,它适用于这个包:http://curl.haxx.se/docs/caextract.html。但是,我应该如何为我的目标网站提取正确的证书? – artvolk

+0

我尝试去掉那个ca文件只是为了证明我在链中,它不起作用:( – artvolk

+0

,风选过程不是我以前试过的东西,它只要你拿出一个就失效了吗?如果是这样,它可能是一个格式问题,否则,你可能需要不断尝试。 –

3

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

  1. 在Firefox中打开https://vk.com/
  2. 导出证书链X.509此网站
  3. 更改目标URL从http://api.vkontakte.ruhttps://api.vk.com/

这是我的代码卷曲选项:

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是带有导出的证书链的文件。

+0

谢谢你的后续行动,但在当时问题被问到,域vkontakte.ru仍然使用。我后来发现这个问题在不完整的证书链中en cert链是由firefox bundle(http://curl.haxx.se/docs/sslcerts.html)手工创建的。 – artvolk

+0

昨天我无法为“vkontakte.ru”构建正确的链,但是使用来自Firefox的包,它按预期工作。另一个问题是,从Firefox的捆绑是相当大的(〜300kb)。你知道链中缺少哪个证书吗? – msangel

+0

现在找不到这个文件,但它是根证书之一,我只是从firefox bundle中删除证书,直到它停止工作。 – artvolk

0

这些是出现工作步骤:

  1. 请访问HTTPS URL在Firefox
  2. 点击绿色栏,单击箭头,然后单击“详细信息”
  3. 点击“查看证书”然后单击“详细信息”选项卡在顶部
  4. 然后点击每个级别和出口证书:

    根CA

    服务器CA

    例如,website.invalid

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

复制该PEM文件到一个目录是用PHP访问,理想的文件有权限644.你甚至可以去444,以防止篡改,并将其更改为644,当你需要更新它。

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

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

警告:当网站更新其SSL证书,上述文件可能会变得过时了,而HTTPS卷曲呼叫可能会失败,打破你的申请。希望有人会在这里回答一个很好的方法来自动更新这个文件。