Nginx配置SSL后Postman调用API报无法验证首个证书错误
问题根因
该报错由Nginx未返回完整SSL证书链导致。
现代浏览器内置AIA(证书权威信息访问)自动拉取逻辑,检测到服务端缺失中间证书时,会自动从证书内置的地址下载对应中间证书完成信任校验,因此访问无警告。但Postman、curl、绝大多数服务端SDK、旧版客户端均无该自动拉取能力,仅拿到服务端返回的单张叶子证书时,无法将证书链溯源到本地信任的根CA,就会抛出Unable to verify the first certificate错误。
修复步骤
- 第一步:确认当前证书文件的内容
在服务器执行如下命令,统计证书文件内的证书条目数:
如果返回值为grep -c 'BEGIN CERTIFICATE' /etc/nginx/conf.d/ssl/******.crt1,即可确认文件内仅包含叶子证书,缺失中间证书。 - 第二步:拼接完整证书链
向证书颁发方索要对应域名的中间证书(也称CA链证书),将叶子证书、中间证书按从上到下的顺序拼接为同一个证书文件,顺序不可颠倒:
你可以直接覆盖原-----BEGIN CERTIFICATE----- 此处为你当前持有的叶子证书(原******.crt的完整内容) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- 此处为证书颁发方提供的中间证书完整内容 -----END CERTIFICATE-----******.crt文件,也可以将拼接后的内容另存为fullchain.crt。 - 第三步:更新Nginx配置并生效
如果选择另存全链证书文件,需要调整Nginx配置中的证书路径:
执行配置校验与重载命令让配置生效:ssl_certificate /etc/nginx/conf.d/ssl/fullchain.crt; # 指向拼接后的全链证书 ssl_certificate_key /etc/nginx/conf.d/ssl/******.key;nginx -t nginx -s reload - 第四步:验证配置有效性
不要用浏览器验证,直接用openssl命令检测服务端返回的证书链长度,返回多个证书条目即为配置正确:
验证通过后再用Postman发起请求,报错即可消除。openssl s_client -connect 你的服务域名:443 -showcerts
临时调试方案(禁止生产环境使用)
如果暂时无法获取中间证书,可以临时关闭Postman的SSL校验:打开Postman设置 -> General面板,关闭SSL certificate verification开关即可正常发起请求。该方式会跳过证书合法性校验,存在中间人攻击风险,仅可用于临时本地调试。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

