我试图让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-----
答案 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):
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 - 感谢您通过此挂我!感谢您的帮助。