cURL error 60: Peer's certificate issuer has been marked as not trusted by the user
PHP中的curl提供了发送网络请求的一系列函数,我们在使用的时候很方便,但有时也会遇到一些问题。标题的错误我曾经遇到过一次,解决之后没有做相关记录,导致最近遇到该错误时,又花了很多时间去解决。
cURL error 60: Peer's certificate issuer has been marked as not trusted by the user
从这个错误提示中的内容可以得知,是证书的问题,而且这个错误提示只会出现在请求HTTPS内容的时候才会出现。
一般来说,对于这个问题,网上会有两种解决方案。第一种就是禁用curl的证书验证,第二种就是在php.ini文件中配置一个默认的证书。
关于上面说的两种解决方案如何操作,我这里就不作赘述了,网上可以找到很多相关的文章和帖子。
我本次遇到的问题是出现在调用腾讯风控接口,由于腾讯提供了SDK,所以底层的HTTP调用都被封装过了,而且使用的是guzzlehttp这个类库去做的调用。所以,无法直接配置curl禁用https证书验证,而且这也是一种不建议的方案。更好的做法是配置一个默认证书,也就是上面说的第二种解决方案,然而,我配置了这个默认证书之后,依然出现这个错误。
于是我就郁闷了,最终没办法,找到了guzzlehttp的底层调用,无奈加上了`$options['verify'] = false;`,使得代码可以正常请求https内容。
public function post($uri, array $options = []): ResponseInterface { $options['verify'] = false; // 这是我新加的取消https证书认证,curl原生方法取消https证书认证方法请自行百度如何处理
return $this->request('POST', $uri, $options); }
第二天早上醒来,突然想起来php的curl扩展貌似有个ssl版本的信息,如果想通过配置默认证书的形式来解决上述的问题,这个ssl必须是openssl,而我本次遇到的问题是出现在我自己编译的php环境下,所以很可能是这个ssl版本的问题,其实这时候我已经回忆起了上次是如何解决这个问题的了。
打印phpinfo看了下结果,果然:
这里显示的是NSS,接下来要做的就是重新编译php的curl扩展,将ssl指定为openssl,这个编译就不做讲解了,不会的兄弟自行百度,这很容易操作的。
好了,这次的这个问题就记录到这里,免得下次遇到又忘记了问题的原因,又要话好几个小时排查。
PHP虽然是世界上最好的语言,其实Java和JavaScript也不错,Python也可以用用,C语言太底层了,C++太复杂,CSS很强大,HTML可不算编程语言。