2

我正在尝试使用 Kohana 在我的 localhost 环境中使用 HTTPS,但它不断抛出以下错误,有谁知道如何解决这个问题?

Request_Exception [ 0 ]: Error fetching remote /protected/someFunctionCall.json [ status 0 ] SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我正在构建这样的帖子请求:

$url = "https://www.foobar.com:18443";          
$data = http_build_query($params);

// This uses POST - http://kohanaframework.org/3.2/guide/kohana/requests#external-requests
$request = Request::factory($url)
        ->method(Request::POST)
        ->body($data)
        ->headers('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');

$response = $request->execute();

我按照本指南使用 OpenSSL 生成了我的自签名证书:

(Simon 的回答):如何在 localhost 上允许 HTTPS 用于 Apache?

4

1 回答 1

4

您很可能会看到此错误,因为您使用的是 SSL 客户端不信任的自签名证书。我不熟悉 Kohana 或 PHP,但我认为客户端可能在幕后使用 openssl。某处应该有一个名为 cacerts.pem 或 ca-bundle.crt 之类的文件来保存信任锚。这些信任锚是客户端软件将信任的 CA 证书。如果服务器使用从这些 CA 之一颁发的证书,则不应出现错误。您可以尝试将您的自签名服务器证书添加到您的 CA 证书文件(例如,cacerts.pem)的末尾。添加证书时,请确保您的证书采用 PEM 格式。PEM 格式的证书由以下几行分隔:

  • -----BEGIN CERTIFICATE-----

  • -----END CERTIFICATE-----

或者,可能有一些选项告诉客户端接受任何服务器证书。不是很好的安全实践,但如果只是自己尝试一下,可以作为临时解决方案。例如,在 cURL 中,有一个选项可以执行此操作。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

cURL 中的正确方法是指定保存信任锚的文件。此代码片段基于我在下面链接到的文章。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/MyTrustedCerts.crt")

使用 CURLOPT_CAINFO,允许您指定保存信任锚的文件的名称。此文件应包含一个或多个证书,客户端软件将使用该证书来验证服务器证书。

此外,设置为 2 的 CURLOPT_SSL_VERIFYHOST 告诉 cURL 检查公用名的存在并验证它是否与提供的主机名匹配。在生产环境中,此选项的值应保持为 2(默认值)。

这篇文章在 PHP 中使用 cURL 访问受 HTTPS (SSL/TLS) 保护的站点有一些解决方法/修复了在 PHP 中使用 cURL 时出现的此错误。

于 2012-03-21T16:41:11.190 回答