共计 1520 个字符,预计需要花费 4 分钟才能阅读完成。
前言
微信小程序在生产环境必须应用域名发动 HTTPS 申请。
这就须要配置 HTTPS。
通常咱们的 nginx 配置文件能够很简略,只须要配置证书和私钥就行:
ssl_certificate your.server.domin.cer;
ssl_certificate_key your.server.domin.key;
此时,应用浏览器发动申请时,曾经能够看到小锁了,相似这样:
但应用微信小程序发动申请时,就可能遇到玄学问题:
- 在开发工具里能够失常发动申请
- 真机调试时,无奈向后盾发动申请,提醒
"errno":600001
- 因为手机型号和零碎不同,甚至呈现“有的手机能够拜访但有的不行”的状况
本文来解决这个问题。
起因剖析
先贴出残缺的控制台信息:
{"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 级了:
此时小程序也能够拜访失常。
总结
- 浏览器只须要有证书和私钥就能通过认证,但小程序多认证了一个证书链
- 残缺的证书链包含 本级域名 的信息和 CA 的信息
- 如果 nginx 只加载本级域名证书,而没有 CA 的证书,就是证书链不残缺,证书评级是 B,就会呈现“网页能拜访但小程序提醒不平安”的问题
- 解决办法就是应用残缺的证书链,能够应用颁发机构生成的,也能够手动拼接
本文只公布 segmentfault,禁止转载,如在其余平台看到请举报。