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的时候,使用购买的证书是否能够正确执行了。

发布了105 篇原创文章 · 获赞 58 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/ljl890705/article/details/78595047
今日推荐