Linux命令行下用curl请求https地址,报如下错误,但是使用浏览器访问确很正常:
cURL error 60: SSL certificate problem: unable to get local issuer certificate
网上大部分是说CA证书的问题,需要下载CA证书(https://curl.se/docs/caextract.html),通过 curl --cacert /path/cacert.pem 方式访问,但是发现还是报上述错误,经排查,还可能存在证书链不完整的原因。
浏览器的处理
现代的浏览器都有证书自动下载的功能,但很多浏览器在安装后是使用系统内置的证书库,如果你缺失的那张CA
证书,在系统的内置证书库中不存在的话,用户第一次访问网站时会显示如下情况:(以Chrome
为例)
即使你的证书确实是可信的,但依旧会显示成不可信,只有等到浏览器自动把缺失的那张CA
证书从网上下载下来之后,访问该网站才会显示成可信状态。
硬件设备的处理
大量的硬件设备并不会像浏览器一样下载CA
证书,如果你缺失的CA
证书不再这些硬件设备的内置证书库中,那么使用这些硬件设备访问网站就会一直显示你的域名是不可信状态。
修复
其实修复的办法很简单,就是在部署证书的时候,把那张缺失的CA
证书一并部署。目前一般的证书签发机构在签发证书的时候会把该CA
证书一并打包。
经与研发沟通发现,在Nginx中配置的证书,未包含全部的证书链导致,添加证书链后,curl访问恢复正常。
提供个网站,检测证书是否正常方面的问题:
https://myssl.com/