2012-03-21 195 views
2

我想在我的本地主机环境中使用HTTPS与Kohana,但它一直抛出以下错误,有谁知道如何解决这个问题?验证SSL证书与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?

回答

4

您很可能会看到此错误,因为您正在使用SSL客户端不信任的自签名证书。我不熟悉Kohana或PHP,但我认为客户端可能使用openssl。某处应该有一个名为cacerts.pem或ca-bundle.crt的文件,该文件包含信任锚。这些信任锚是客户端软件将信任的CA证书。如果服务器使用从其中一个CA颁发的证书,则不应该得到该错误。您可以尝试的是将您的自签名服务器证书添加到您的CA证书文件的末尾(例如,cacerts.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(默认值)。

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

+0

是的,我设法通过curl将上面的'CURLOPT_SSL_VERIFYPEER'变量设置为false来做SSL POST请求。但这不是一个理想的解决方案。 – diggersworld 2012-03-21 17:27:16

+0

是的,正确的方法是告诉客户它可以信任哪些证书。用cURL你可以做到这一点。我已经添加了一些示例代码。 – PhilR 2012-03-21 17:48:30