用于 Web 服务访问的 PEM 文件的来源


Source of PEM files for web service access

我应该更多地关注我的课程,这些课程涵盖了安全性。我对某件事很困惑。首先,这是我试图完成的工作的背景。

我有一个需要访问的 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指定此文件的路径。