摘要
最近突然发现我的网站在苹果手机上Safari浏览器上第一次会访问会非常慢,但只要第一次访问后,后续的访问速度均不受影响...这就纳闷了,网站速度我都是优化过的,为什么会存在这种情况呢?困扰我许久,因为只有手机访问才这样,在电脑上访问速度都很快,完全没有头绪。
正文
一、问题研究
在多次尝试后,发现在Firefox和IE浏览器上能复现该问题,在ssl握手之前,Firefox会阻塞2s,IE浏览器会阻塞10s以上;
问题能复现就好解决了;
使用Charles进行抓包,发现使用IE打开网站的时候,会去请求ocsp.int-x3.letsencrypt.org
域名进行证书验证,该域名无法访问从而导致访问速度变慢;
所以问题就出在SSL证书上面,我使用的证书全部是Let's Encrypt证书,其特点是免费、支持泛域名、并且脚本一键部署,但是Let's Encrypt证书的OCSP验证域名被DNS污染,无法解析到正确的IP地址,导致无法进行证书有效性验证。
Nginx OCSP stapling
由网站服务器去进行OCSP查询,缓存查询结果,然后在与浏览器进行TLS连接时返回给浏览器,这样浏览器就不需要再去查询了。别急,开启之前我们是不是得先知道如何查询是否开启了OCSP装订,自:新消息频道 不然捣鼓半天都不知道开启成功了没有可还行..
检测OCSP
有两种方法: 1.在线检测: 亚洲诚信的SSL检测工具 https://myssl.com/
手动检测:
代码语言:javascript复制openssl s_client -connect ffis.me:443 -servername ffis.me -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
开启 OCSP stapling
开启OCSP装订需要在网站的nginx配置文件中添加如下配置:
代码语言:javascript复制# 开启 OCSP Stapling,开启后服务器在TLS握手时发送事先缓存的OCSP响应,用户只需验证该响应的有效性而不用再向数字证书认证机构(CA)发送请求
ssl_stapling on;
# 启用或禁用服务器对OCSP响应的验证
ssl_stapling_verify on;
# 证书的签发机构的ca证书,我的Let's Encrypt是acme.sh自动获取的证书,ca证书目录为:/root/.acme.sh/ffis.me/ca.cer
ssl_trusted_certificate /usr/local/nginx/conf/ssl/ffis.me_ca.cer;
# 添加resolver解析OSCP响应服务器的主机名,valid表示缓存。这里添加是为了解决DNS污染问题。
resolver 8.8.8.8 8.8.4.4 223.5.5.5 valid=60s;
# 网络超时时间
resolver_timeout 2s;
添加后,重启nginx服务器,再次使用命令验证,OCSP装订是不是就已经开启了。
Firefox、IE、Safari浏览器的访问也正常了
再次使用Charles进行抓包,发现浏览器会跳过OCSP验证
。之后我会在写一下关于开启OCSP的弊端和优化方案。
完结
以上就是Nginx开启OCSP以解决Let's Encrypt证书被DNS污染访问缓慢的内容,欢迎小伙伴们交流讨论。