我应该更多地关注我的课程,这些课程涵盖了安全性。我对某件事很困惑。首先,这是我试图完成的工作的背景。
我有一个需要访问的 Web 服务。Web 服务设置为 HTTPS。客户端和服务器之间的流量是加密的(这与身份验证无关)。
我正在通过cURL和PHP与Web服务进行交互。我已经有一个通过HTTP在本地工作的例子,我相当有信心我在cURL/PHP方面走在正确的轨道上。
当使用HTTP版本的代码通过HTTPS访问Web服务时,我得到了一个error code 60 "SSL certificate problem, verify that the CA cert is OK" (error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed)
从我的阅读来看,似乎我需要一个 PEM 文件,我需要设置其他 cURL 选项,如下所示:
- CURLOPT_CAINFO
- CURLOPT_SSLCERT
- CURLOPT_SSLKEYPASSWD
我的问题是我如何知道从哪里获得 PEM 文件或我是否可以简单地制作它?这可能是一个显而易见的答案,因为我确定我错过了一些东西,但我想我只需要问并获得我错过的背景。
修正:Web 服务正在使用由 VeriSign 签名的证书。因此,它不是自签名证书。此外,Web 服务由外部组织拥有和运营。
谢谢。
尽管在问这个问题之前谷歌搜索了一下,但似乎我在与"thatidiotguy"(他的用户名,不是我的名字)的四分之一之后偶然发现了答案。
开箱即用的cURL不信任任何CA(VeriSign或其他)。这需要在服务器上进行设置。要"解决"问题,您有两种选择。您可以使用以下命令绕过验证:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
请注意,这在安全性方面不是最佳的。任何证书,无论是否由 CA 签名,都将被接受为受信任证书。
正确的修复包括获取原始证书(在我的情况下,这意味着 Web 服务)并将证书"导出"为 X.509 证书 (PEM)。然后,需要将证书适当地移动到服务器并设置以下配置:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //Check that the common name exists and that it matches the host name of the server
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/path/to/cert/my-exported.crt"); //PEM file
资料来源:http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/
答案很简单。您需要下载证书包,该包也随常规浏览器一起提供。
幸运的是,这里已经为您完成了工作:
http://curl.haxx.se/docs/caextract.html
下载后,您可以使用CURLOPT_CAINFO指定此文件的路径。