关于nginx:解决nginx开启HTTPS之后网页正常但微信小程序无法连接提示errno600001证书验证失败的问题

2次阅读

共计 1520 个字符,预计需要花费 4 分钟才能阅读完成。

前言

微信小程序在生产环境必须应用域名发动 HTTPS 申请。
这就须要配置 HTTPS。
通常咱们的 nginx 配置文件能够很简略,只须要配置证书和私钥就行:

ssl_certificate your.server.domin.cer;
ssl_certificate_key your.server.domin.key;

此时,应用浏览器发动申请时,曾经能够看到小锁了,相似这样:

但应用微信小程序发动申请时,就可能遇到玄学问题:

  1. 在开发工具里能够失常发动申请
  2. 真机调试时,无奈向后盾发动申请,提醒"errno":600001
  3. 因为手机型号和零碎不同,甚至呈现“有的手机能够拜访但有的不行”的状况

本文来解决这个问题。

起因剖析

先贴出残缺的控制台信息:

{"errno":600001,"errMsg":"request:fail errcode:-202 cronet_error_code:-202 error_msg:net::ERR_CERT_AUTHORITY_INVALID"}

简略翻译一下就是:证书验证失败。

这个时候就纳闷了:明明我浏览器曾经提醒平安了啊?怎么微信小程序就不行了呢?

去查这个 600001 错误代码,确实有其他人遇到过,比方这个问答:
https://developers.weixin.qq.com/community/develop/doc/000408…

但网上查不到十分有价值的信息,只是晓得可能是“证书链”的问题,
在官网文档对于 HTTPS 证书这一块有这些要求:

其中有一条就是证书信赖链必须残缺。

那么怎么查呢?

这个网站 https://myssl.com/ 提供了证书检测的性能。

HTTPS 是工作在 应用层 的,所以必须输出 ”协定 + 域名 + 端口“ 而不是 ” 协定 + 域名 ”

对于一个小程序连不上的后盾地址,会提醒证书评级为 B 级,并且证书链不残缺:

的确是证书的问题。

那么怎么解决呢?

解决

对于通过 acme 自动化部署的证书,部署时会生成一组文件,包含:

  • ca.cer——颁发机构 CA 的证书
  • fullchain.cer——残缺证书链
  • your.domin.cer——本级域名证书
  • your.domin.key——本级域名私钥

可能还有其余文件,但咱们只须要钻研这几个就能够了。

通常直觉上一看,your.domin.cer 和 your.domin.key 这俩文件齐刷刷的,必定就是这俩了。

这样的确能够,而且浏览器也认可这个证书,然而小程序不认。

证书链不残缺的意思就是:只加载了本级域名的证书但没有加载 CA 的证书。这就是小程序不能用的间接起因。

另外,如果咱们输入 your.domin.cer、ca.cer、fullchain.cer,就会惊奇的发现,fullchain.cer 就是 后面两个文件内容连起来,看图:

ca.cer:

domin.cer:

fullchain.cer(留神看,这里是两段):

所以,fullchain = ca + yourdomin

论断很简略,如果你部署证书的文件夹中有两段的 fullchain.cer 文件,就用这个文件作为证书;
如果某些证书发放机构没有给出残缺的证书链,就把 yourdomin 和 ca 这两个文件拼起来作为证书。

这样一波操作之后,再检测一下证书,就是 A 级了:

此时小程序也能够拜访失常。

总结

  1. 浏览器只须要有证书和私钥就能通过认证,但小程序多认证了一个证书链
  2. 残缺的证书链包含 本级域名 的信息和 CA 的信息
  3. 如果 nginx 只加载本级域名证书,而没有 CA 的证书,就是证书链不残缺,证书评级是 B,就会呈现“网页能拜访但小程序提醒不平安”的问题
  4. 解决办法就是应用残缺的证书链,能够应用颁发机构生成的,也能够手动拼接

本文只公布 segmentfault,禁止转载,如在其余平台看到请举报。

正文完
 0