问题
服务端证书使用的是 Let's Encrypt
问题的起因是IOS系统中使用微信小程序,请求服务器接口,首次请求需要等待3 ~ 10秒。导致小程序初次打开白屏。
在反复验证后,排除了Nginx、Tomcat、Java等问题。最终锁定了问题出在HTTPS证书上。
最终参考了V站大佬的帖子才恍然大悟。
在某些系统以及某些特定的浏览器下,会要求在线校验证书的有效性,称为 在线证书状态协议 (Online Certificate Status Protocol)
简称 OCSP
,测试后发现比较新的Chrome内核
和Firefox内核
不会 进行校验,而苹果系统下的Safari 会 校验,IE 未知 ,在IOS系统的微信小程序 会 校验,Android系统的微信小程序则 不会 进行校验
补充一下:校验地址如果访问不通,会一直等到访问超时,所以会peding 3 ~ 10秒,超时以后会默认为安全,所以不会出现证书不安全的提示。本次访问的后续请求依然可以正常执行,只会表现为首次请求慢。
测试
经测试,Let's Encrypt
的证书的OCSP地址是
这个地址在国内大部分地区都无法请求成功,俗称被墙
测试地址
测试结果
上述结果中的绿色部分也只是极个别情况,该地区的99%的运营商其实也是红色超时状态,白色是仍然在 pending
中,我懒得继续等了
解决
方案1 换证书 (推荐)
目前除了 Let's Encrypt
以外,就只剩下 亚洲诚信
可以申请到免费的HTTPS SSL证书了,不过 Let's Encrypt
是支持多域名、泛域名的。而 亚洲诚信
免费证书只能申请单域名。
到例如腾讯云、阿里云、又拍云的管理后台,搜索SSL证书,申请即可,一般当天可以获得一张一年有效期的单域名证书,支持下载证书文件。其中主域名 abc.com
和 www.abc.com
是可以共用一张证书的,按 abc.com
申请即可。其他二级域名例如 music.abc.com
需要多次申请
方案2 OCSP Stapling
这是一个曲线救国的方案,也就是在Nginx配置OCSP的校验地址,到你自己的服务器或CDN,来避免访问不通原地址。
这个方案我没有具体实施,所以建议参考这几篇文章,说的比较详细了
CDN方案
www.alibabacloud.com/help/zh/doc…
Nginx方案