PHP cURL 和 SSL 证书错误

3

使用 CURLOPT_SSL_VERIFYHOST 时出现了这个错误:

Curl error: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我尝试过:

1 - 关闭VERIFYHOST不是一个选项,我需要它来登录https页面。

2 - 下载了证书并像这样使用:

    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($c, CURLOPT_CAINFO, getcwd() . '/certificate.pl.crt');  

我仍然得到相同的错误。
3 - 我在Apache扩展中打开了ssl_module(我使用WAMP)
4 - 我在PHP扩展中打开了php_openssl
还需要做什么?从phpinfo()中我知道我有:
mod_ssl/2.2.22 
OpenSSL/0.9.8u

而且它还是不起作用。我还应该做什么 :( ?

verifyhost不会禁用SSL,它只是关闭了对服务器端证书的验证。您确定您拥有的.crt文件是签署运行您尝试访问的站点的SSL证书的CA的证书吗?下载站点自己的.crt文件没有任何用处。 - Marc B
@MarcB 我从 https://poczta.interia.pl/ 下载了 .crt 文件,但 POST 信息会发送到 https://logowanie.interia.pl,这有区别吗?因为原始文件名是 *.interia.pl.crt,所以我认为它适用于整个网站。https://logowanie.interia.pl 重定向到主页,所以我无法从那里下载 crt 文件。 - Anfo Anfo
我刚刚关闭了VERIFYHOST,但仍然出现错误。我检查了一下,将CURLOPT_SSL_VERIFYPEER设置为True会导致错误,但是如果关闭VERIFYPEER,我就无法登录(它会说我需要打开cookie,但我已经使用chmods创建了cookie.txt文件,所以我认为SSL是问题的原因)。 - Anfo Anfo
1
*.interia.pl将是一个通配符证书,覆盖interia.pl域名上的所有主机名。但是,为了使.crt文件在验证您要访问的主机时有效,它必须是签署您站点证书的证书颁发机构的公钥证书,而不是证书本身。 - Marc B
如果curlopt_ssl_verifypeer为false,数据传输是否不再安全? - Marc B
显示剩余2条评论
1个回答

0

我之前漏掉了一些评论,所以必须进行编辑。

如果您不尝试导入证书并关闭对等验证,则您的传输仍应该是SSL安全的,如果我没有弄错的话,因此,如果目标是通过ssl传输它,那么我不会烦恼于证书的导入。当然,如果您想要更多的安心,那就另当别论了。


SSL安全有两个主要目标:1.加密以保护隐私;2.验证以确保您正在与正确的服务器通信。如果没有验证,您将丧失大约一半的安全模型。 - Mark Fox
如果您拥有服务器并且仅供内部使用,人们往往会自签名。您最信任谁,是自己还是第三方?自签名证书并不会更不安全。您可以轻松地在负载均衡器上终止SSL,然后从那里嗅探到内部节点的会话。客户端不知道发生了什么。SSL不能保护您免受此类攻击。导入自签名证书并不会更不安全。它只是在浏览器中看起来不好而已。您与正确的服务通信,而不是与正确的服务器通信。您永远不会知道哪个服务器为您提供服务,但您确实知道该服务。 - Glenn Plas
这是一个很好的观点。但是,对于自签名证书,CURLOPT_SSL_VERIFYHOST是否能够为您提供额外的保证,以确保您不会处理伪造证书?TLS很复杂,特别是使用cURL时,实现细节对我来说有些模糊。无论如何,这真的取决于您要保护的数据和您的用例是什么。如果您的证书由CA颁发,我认为验证主机仍然是一个好主意——请参见SSL中间人代理,它可以代理和伪造:但是用户会收到警告,因为伪造证书未经CA颁发。 - Mark Fox
绝对正确。该curl选项基本上表示:不要检查证书。几个月前,我不得不在API上的SSL证书过期后执行此操作,该证书是由CA签名的。TLS也很难平衡,因为SSL会话ID在TLS票据之间更改。我不想实现那个。有一个非常不错的工具可用于帮助测试SSL。请参见https://github.com/vincentbernat/rfc5077。 - Glenn Plas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接