0

我应该更多地关注我的安全课程。我对某事感到很困惑。首先,这是我要完成的工作的背景。

我有一个需要访问的 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 服务由外部组织拥有和运营。

谢谢。

4

2 回答 2

1

尽管在问这个问题之前四处搜索,但似乎我在与“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/

于 2012-08-16T20:56:57.087 回答
1

答案很简单。您需要下载一个证书包,它也随常规浏览器一起提供。

幸运的是,这里已经为您完成了这项工作:

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

下载后,您可以使用 CURLOPT_CAINFO 指定此文件的路径。

于 2012-08-17T00:03:22.970 回答