error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

今天调试https接口的时候,遇到这样一个错误:
curl errno=60; curl error=SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

找到了一篇相关文章using-curl-in-php-to-access-https-ssltls-protected-sites

通过文章里介绍的暂时解决方法,绕过证书检测:

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

这样设置之后,可以正常执行了。

然而在使用文章介绍的正确处理方法,通过下载证书,并指定

curl_setopt($curl, CURLOPT_CAINFO, getcwd().'/CA/***.crt');

之后再次执行请求,却并没有解决问题。

有些奇怪,在之前使用框架类库操作的时候是没有这个问题出现的,然后查看了一下框架类库的源码,找到了如下的配置:

curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);

确认了一下这两个配置参数的具体作用,分别是:

CURLOPT_SSL_VERIFYPEER  

FALSE 禁止 cURL 验证对等证书(peer's certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。     

自cURL 7.10开始默认为 TRUE。从 cURL 7.10开始默认绑定安装。
-----------------------------
CURLOPT_SSL_VERIFYHOST  

设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。
译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 
设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值)。     

值 1 的支持在 cURL 7.28.1 中被删除了。

查了一下自己服务器的curl版本curl --version,原来是7.22,还是支持CURLOPT_SSL_VERIFYHOST值为1的配置的。

继续查了一下“对等证书”这个东西,发现这个证书可能需要到oscp证书服务器验证有效性,而“CURLOPT_SSL_VERIFYPEER”这个选项如果不设置的话,默认为true,那就是需要到oscp证书服务器去验证有效性了,然而我们公司服务器使用的证书,都是自己生成的,并不是买的,所以到这里判断问题有极大的可能是因为服务器使用的证书是自己生成的,当curl未设置此参数时,默认到oscp证书服务器去验证证书却未通过导致错误。

因为公司当前并不会购买证书使用,所以也无法继续验证“CURLOPT_SSL_VERIFYPEER”为true的时候,使用购买的证书是否能够正确执行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误的含义是 "ssl23_get_server_hello: tlsv1 alert protocol version",意思是 SSL 协议中检测到了不支持的协议版本。可能是因为服务器端使用的 SSL/TLS 协议版本过低或过高,导致连接不成功。 ### 回答2: 在网络通信中,SSL协议是一种用于保障通信安全的协议。当客户端与服务器之间进行SSL握手时,若两端协议版本不一致,可能会导致握手失败,从而出现error:1407742e:ssl routines:ssl23_get_server_hello:tlsv1 alert protocol version的错误。 通常,该错误是由于客户端或服务器使用的SSL协议版本不一致导致的。例如,当客户端尝试使用TLSv1.2版本与服务器进行通信,但服务器只支持TLSv1.1时,就会出现该错误。在这种情况下,客户端会发送一个tlsv1 alert protocol version警告给服务器,提示协议版本不匹配,导致握手失败。 为了解决这个问题,需要检查客户端和服务器使用的SSL协议版本是否一致。如果不一致,可以尝试升级其中一个协议版本,或者让双方都支持两种协议版本,从而保证通信的顺利进行。 此外,当出现该错误时,还可以检查是否有防火墙或代理服务器等中间设备对SSL通信进行了拦截或篡改,从而导致协议版本不一致。如果存在这样的问题,应该对中间设备进行相应的配置调整,以确保正常的SSL通信。 ### 回答3: 该错误代码错误:1407742e:ssl routines:ssl23_get_server_hello:tlsv1警报协议版本,通常是因为服务器或客户端使用不受支持的 TLS(安全传输层)协议版本。TLS是一种用于保护互联网通信安全的协议,在网上银行、电子邮件和其他敏感信息的传输中得到了广泛应用。 当服务器和客户端之间的通信请求使用暂不支持的协议时,访问中断并返回此错误。因此,用户需要保证服务器和客户端使用的 TLS 协议版本是彼此兼容的。大多数现代浏览器均兼容 TLS1.2 或更高版本,许多老版本浏览器使用的协议版本可能已经过时,需要更新或升级浏览器。 此外,确保服务器和客户端的时间同步和准确也很重要。如果服务器的时间与客户端时间差距太大,则可能会导致 TLS 通信失败。如果 HTTP 服务器的时间与证书的有效期不一致,也会引起此错误。因此,建议用户确保服务器证书正确,并在必要时更新或更换证书。 总的来说,当出现此错误时,用户应该检查确认服务器和客户端所使用的 TLS 协议版本是否兼容,并确保服务器证书的有效期和时间与本地相同。如果问题仍然存在,则需要咨询网络服务的供应商或 IT 专业人员以获得更多支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值