无法使用cURL SSL工作

时间:2016-03-23 22:29:50

标签: php ssl curl https ssl-certificate

我试图让PHP cURL从https://www.google.com返回标头。我这样做是为了让我能够理解如何配置PHP curl_setopt参数以便与SSL网站一起正常工作。通过"正确"我的意思是我希望cURL应用CURLOPT_SSL_VERIFYPEER参数来验证服务器的安全证书。

这对我来说是个新的理由。我对此过程的工作方式有一种模糊的理解,但我无法获得以下代码来返回google.com标题:

<?php

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.google.com');

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,1);
curl_setopt($ch, CURLOPT_CAINFO, "c:/wamp/www/certificates/googleCA.cer");

curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true); // HTTP request is 'HEAD only'
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:31.0) Gecko/20100101 Firefox/31.0');
curl_setopt($ch, CURLOPT_REFERER,'https://www.google.com');
$headers=curl_exec($ch);

print_r($headers);

echo "Got to end!";

?>

我已按照以下链接中的说明使用IE11从Windows中提取google.com证书的副本:

http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

上述链接描述的证书提取似乎没问题。我在Windows 7 64位计算机上。我将来自IE11的顶级证书保存为&#39; Base-64编码的x.509(CER)&#39;提交到我的&#c; \ WAMP \ www \ certificates \&#39;文件夹为&#39; googleCA.cer&#39;。然后,我将CURLOPT_CAINFO参数设置为&#39; c:/wamp/www/certificates/googleCA.cer'。当我执行PHP代码时,带有CURLOPT_VERIFYPEER参数返回的谷歌标题AREN&T; T被设置为&#34; 1&#34; (我知道将CURLOPT_VERIFYPEER设置为&#34; 0&#34;指示cURL不验证服务器证书,它确实返回标题,但这是一个我不想使用的完全不安全的配置。)< / p>

这感觉就像我使用IE11从Windows导出的证书有问题。我还发现此链接描述了从cURL网站下载cacert.pem文件:

https://curl.haxx.se/docs/caextract.html

当我点击上面的链接时,我得到了IE11中提供的caextract文件的文本。我不知道接下来该做什么。任何帮助将不胜感激。

非常感谢! -

编辑:以下是googleCA.cer文件的内容:

-----BEGIN CERTIFICATE-----
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
-----END CERTIFICATE-----

1 个答案:

答案 0 :(得分:2)

此问题的答案是,在IE11中为https://www.google.com显示的根证书“GeoTrust Global CA”与根据名为“Equifax Secure Certificate Authority”的旧版GeoTrust根证书交叉根据。 当我的PHP脚本使用在我的IE11中显示为3证书链中的根的“GeoTrust Global CA”证书作为https://www.google.com的根证书时,我的PHP脚本无法进行身份验证https://www.google.com的证书 BECAUSETHE真实的根证书https://www.google.com不是“GeoTrust全球CA”证书,而是GeoTrust“Equifax安全证书颁发机构”证书。一旦我想到这一点在我的PHP .PEM文件中使用了“Equifax安全证书颁发机构”,我成功验证了https://www.google.com证书。

您可以通过执行以下操作来了解如何进行交叉生成(我使用了IE11):

  1. 打开 BLANK https://www.google.com网页
  2. 点击网址窗口中的挂锁图标,然后点击“查看证书”。
  3. 出现https://www.google.com的“证书”窗口。单击“证书路径”选项卡。将显示三个证书的证书链。 “GeoTrust Global CA”证书显示为根证书 - 但这不是正确的。
  4. 关闭“证书”窗口。在“开始”菜单的“运行”框中(我使用的是Windows 7),键入“certmgr.msc”并单击“确定”按钮。这将启动Windows的证书管理器。
  5. 单击左窗格中的“受信任的根证书颁发机构”条目,然后单击“证书”。
  6. 在右侧窗格中,找到“GeoTrust Global CA”证书。双击此条目以打开其证书窗口。
  7. 单击“详细信息”选项卡,然后单击“编辑属性”按钮。注意选择“服务器验证”,“客户端验证”,“代码签名”,“安全电子邮件”和“时间戳”。
  8. 单击“禁用此证书的所有用途”按钮。这将使该证书无法使用。关于“通用”选项表的说明本证书的到期日为5/20/2022,并且“发布至:”和“发布者:”项目已签署“GeoTrust Global CA”,表明这是根证书。单击“确定”按钮返回Windows证书管理器。最小化证书管理器。
  9. 转到空白https://www.google.com网页。 刷新页面,然后查看证书。现在你将看到四个证书,不过在SETP#3中显示的三个证书!
  10. 发生了什么?双击“GeoTrust Global CA”证书。查看“常规”选项卡上的截止日期。这是8/20/2018,而不是在步骤#3中显示的“GeoTrust Global CA”证书的5/20/2022。另请参阅“发布到:”和“发布者:”项目 - 它们是不同的。 “颁发给:”是“GeoTrust Global CA”,“颁发者”是“Equifax安全证书颁发机构”。这是一个不同的“GeoTrust全球CA”证书,它在第3步显示! 此版本的“GeoTrust Global CA”证书与“Equifax安全证书颁发机构”交叉根据“发布者:”项目证明!!
  11. 双击“GeoTrust”根证书。请注意,这是由“Equifax安全证书颁发机构”颁发的自签名根证书。 这是https://www.google.com使用的真实根证书!! 当我将此证书复制到我的PHP .PEM文件中并用它来验证https://www.google.com的证书时,一切正常! !
  12. 返回Windows证书管理器并反转在步骤5 - 8中执行的禁用。单击“仅启用以下用途”按钮并重新检查步骤7中列出的用途。这会将您在日期为5/20/2022的“GeoTrust Global CA”证书恢复为正常运行状态。
  13. GeoTrust网站上有一个链接,描述了步骤#9中出现的“GeoTrust Global CA”交叉根证书。你也可以下载它。但是,对于我的应用程序,交叉根证书未验证https://www.google.com的证书 - 我需要使用“GeoTrust”ROOT证书,因为它是唯一能够验证https://www.google.com的证书。这是链接:

    https://knowledge.geotrust.com/support/knowledge-base/index?page=content&id=AR1426

    您还可以从GeoTrust网站下载相应的“GeoTrust”证书。它被列为资源中的“Equifax安全证书颁发机构”&gt;本网站的根证书部分。这是链接:

    https://www.geotrust.com/resources/root-certificates/

    您还可以通过访问以下Symantec网页找到有关任何网页的证书链的更多详细信息:

    https://cryptoreport.websecurity.symantec.com

    我希望这可以帮助那些需要验证与Google.com的HTTPS连接的PHP开发人员。 DREW010 - 感谢您通过此挂我!感谢您的帮助。