起因
最近优化移动站,发现在手机上打开巨慢,第一反应是服务器的问题,查了没问题,接着查后端,数据库,甚至是模板,都没有结果,后来排除了前几样之后,建个空白文件访问都巨慢。一时摸不着头脑!
定位问题
然后实在没有思路了,就抓包一下访问请求,发现是HTTPS的问题,请求一个ocsp.int-x3.letsencrypt.org会非常的慢,然后就是超时,服务器上ping也是超时,问题基本上就差不多定位到这个上了。
这个问题的产生是因为这个域名使用了CDN,CDN解析的CNAME节点被污染了,造成国内无法请求到(原因就不多说了,谣传是某数字公司造成的)。
OCSP是干嘛的
这玩意干嘛的其实自行百度一下就知道了,我只粗略的说一下,这个是域名证书的有效期检查和状态检查,比如到期了,或者证书吊销了,这个在IE下只请求2s后就抛弃,Chrome压根不请求这玩意,Safari比较另类,持续性请求。
解决问题
这个问题解决起来搜遍了全网,无非就两个解决方案
第一个,服务器内hosts一个可请求到ocsp.int-x3.letsencrypt.org这个域名的IP,但这个域名采用的是CDN,怕是CDN分配的IP存活期也不会太长,经常换也是麻烦
第二个方案也就是我正在使用也推荐的方案,使用谷歌DNS来进行请求,方案如下:
以NGINX为例,在站点配置文件证书配置的部分里,增加:
# 启用OCSP stapling
ssl_stapling on;
# 启用OCSP响应验证,OCSP信息响应适用的证书
ssl_stapling_verify on;
#CA根证书路径 如果ssl_certificate证书是完整的证书链,此项可以不设置
ssl_trusted_certificate /usr/local/nginx/ssl_cert/ca.crt;
# valid表示缓存300秒,resolver_timeout表示网络超时时间
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 2s;
为了更可靠,你也可以人工负责更新文件内容,设定Nginx直接从文件获取OCSP响应而无需从服务商拉取。
# 启用OCSP stapling
ssl_stapling on;
ssl_stapling_file /usr/local/nginx/oscp/stapling_file.ocsp;
# 启用OCSP响应验证,OCSP信息响应适用的证书
ssl_stapling_verify on;
ssl_trusted_certificate /usr/local/nginx/ssl_cert/ca.crt;
四者缺一不可,然后重启nginx
接着再执行
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
进行检查是否生效
生效会提示:
OCSP response:
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
失败会提示:
OCSP response: no response sent
这样就解决了COSP引起的在苹果手机里访问太慢的问题了