前言

微信小程序在生产环境必须应用域名发动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,禁止转载,如在其余平台看到请举报。