使用Kohana验证SSL证书失败

时间:2012-03-21 15:59:42

标签: ssl certificate kohana ssl-certificate verify

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

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生成自签名证书:

(西蒙的回答):How do I allow HTTPS for Apache on localhost?

1 个答案:

答案 0 :(得分: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,您可以指定包含信任锚的文件的名称。此文件应包含客户端软件将用于验证服务器证书的一个或多个证书。

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

在PHP中使用cURL时,本文Using cURL in PHP to access HTTPS (SSL/TLS) protected sites对此错误有一些解决方法/修复。