1 起因
最近突然发现我的网站在苹果手机上
困扰我许久,因为只有手机访问才这样,在电脑上访问速度都很快,完全没有头绪
2 问题研究
在多次尝试后,发现在
问题能复现就好解决了;
使用ocsp.int-x3.letsencrypt.org
所以问题就出在
这时候有同学要问了:OCSP
OCSP 称 Online Certificate Status Protocol,即在线证书状态协议。
说白了就是查询你的
可全球这么多网站,都去验证的话
不同浏览器都会有不同的
但是有些
由于直接查本地的列表速度就非常快了,缺点是不是实时的;受
但是有些浏览器,比如苹果的
由于
如何解决
那么解决办法显而易见了~ 对!就是换个
好了本文结束,感谢大家的阅读,完结撒花~~
哈哈,换
所以还是得想办法解决
这时候就需要
3 Nginx OCSP stapling
由网站服务器去进行
是不是很棒?
别急,开启之前我们是不是得先知道如何查询是否开启了
4 检测 OCSP
有两种方法:
1.
亚洲诚信的
2.
openssl s_client -connect ffis.me:443 -servername ffis.me -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
5 开启 OCSP stapling
开启
# 开启 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;
添加后,重启
使用
Firefox、IE、Safari
再次使用
6 弊端
此方式实现了
但是
在
这样就会导致总会有几次访问并没有走
7 优化
那如何解决呢?
最好的办法就是我们人工去请求
这里我自己编写了ssl_stapling_file
指令直接读取本地响应信息,这样就不会去实时查询证书的
开始优化
由于
一:我们更改服务器的
二:直接修改本地ocsp.int-x3.letsencrypt.org
这里我选择第二种,直接修改本地
// 编辑 Hosts 文件
vi /etc/hosts
// 添加如下信息
175.45.42.218 ocsp.int-x3.letsencrypt.org
这里列举出来一些常用的ocsp.int-x3.letsencrypt.org
23.44.51.8 (美国)
23.44.51.27 (美国)
104.109.129.57 (英国)
104.109.129.11 (英国)
175.45.42.209 (香港)
175.45.42.218 (香港)
223.119.50.201 (香港)
223.119.50.203 (香港)
23.32.3.72 (东京)
2.
直接在指定目录vim getOCSP.sh
,输入以下脚本信息(仅在
#!/bin/sh
SITE=$1
if [ ! $1 ]; then
echo "请输入查询域名!正确打开方式:sh getOCSP.sh ffis.me"
exit 0;
fi
# acme.sh 安装目录
LEDIR=/root/.acme.sh
# 证书目录
DIR=$LEDIR/$SITE
# Let's Encrype OCSP 服务器地址
HOST=ocsp.int-x3.letsencrypt.org
# OCSP 响应保存文件地址
OUTDIR=/xxx/xxx/xxx/xxx/xxx/live
# 日志文件地址
LOGFILE=$OUTDIR/log/get-ocsp_$(date +\%Y\%m\%d).log
echo $(date +"%Y-%m-%d %H:%M:%S") '-----域名:'$SITE '开始请求 OCSP 响应------' >> $LOGFILE
# 请求 ocsp 响应并保存到本地文件
openssl ocsp -no_nonce \
-respout $OUTDIR/$SITE.ocsp.resp.new \
-issuer $DIR/ca.cer \
-verify_other $DIR/ca.cer \
-cert $DIR/$SITE.cer \
-url http://$HOST/ \
-header "host="$HOST > $OUTDIR/$SITE.ocsp-reply.txt 2>&1
if grep -q ": good" $OUTDIR/$SITE.ocsp-reply.txt; then
if cmp -s $OUTDIR/$SITE.ocsp.resp.new $OUTDIR/$SITE.ocsp.resp; then
rm $OUTDIR/$SITE.ocsp.resp.new
else
mv $OUTDIR/$SITE.ocsp.resp.new $OUTDIR/$SITE.ocsp.resp
# nginx 配置重载
systemctl force-reload nginx.service > /dev/null
fi
else
cat $OUTDIR/$SITE.ocsp-reply.txt | echo "OCSP error for $SITE"
fi
# 输出到控制台
cat $OUTDIR/$SITE.ocsp-reply.txt
# 输出到日志文件
cat $OUTDIR/$SITE.ocsp-reply.txt >> $LOGFILE
# 记录最后一次 OCSP 请求结果
mv $OUTDIR/$SITE.ocsp-reply.txt $OUTDIR/$SITE.ocsp-reply-old.txt
echo $(date +"%Y-%m-%d %H:%M:%S") '------------OCSP 响应请求完毕------------' >> $LOGFILE
我的这个脚本是针对 acme.sh 脚本而编写的,
如果你使用的也是
acme.shLEDIR
OCSP 响应保存文件地址:OUTDIR
LOGFILE
如果要获取指定证书文件的
3.
// 添加可执行权限
chmod +x getOCSP.sh
// 运行脚本
./getOCSP.sh ffis.me
//PS:后边的参数为需要获取 OCSP 响应的域名
运行后就会在指定的目录生成
这时的
ssl_stapling on;
ssl_stapling_verify on;
//OCSP 响应文件地址
ssl_stapling_file /xxx/xxx/xxx/xxx/xxx/live/ffis.me.ocsp.resp;
重启
这时再去检测下
虽然我们本地预加载了
// 编辑 crontab 定时任务
crontab -e
// 添加如下命令
#每日 2:22 分刷新 OCSP 缓存
22 2 * * * /root/getOCSP.sh ffis.me > /dev/null 2>&1
这样
至此我们的
IE 已经不算浏览器了 
最好的解决方案还是放弃 Let's Encrypt,虽然说明 1.13 以后因为 LE X3 证书到期更换 OCSP 被污染的问题会解决,不过离开了 DST Root 新的根证书时间太短导致安卓 7 以下以及 16 年以前的一些设备没办法信任这个证书
最近看到环智中诚那个 Encryption365 提供泛域名,他家海外的 ECMP AllinSSL 也可以直接申请 https://allinssl.com/zh/,和 LE 一样是 90 天的有效期,就都换过去了 
补充下 ZeroSSL 的 ACME 方式也可以签发通配符,之前在网站上看到没有还以为不提供…… Sectigo 的根证书,还支持 ACME 自动化,基本上可以代替 LE 了
同样是
https://zerossl.com/features/acme/
OK,已经换上了,acme.sh 直接更换 CA 可无缝切换使用,美滋滋

感谢推荐,这个确实可以考虑,但是我实在是懒得换,白嫖这么久都用出感情了
,落后的设备就让它淘汰吧!积极拥抱新技术,一起走向新未来 
谢大佬的分享,自动抓取脚本写的比我的好多了。不过发现有个问题,在 header 的 HOST 部分在 Ubuntu Server 20.04 下会出现 HOST 无效的错误:
我看了下似乎是和 openssl 版本有关,新版本参数更改为 header host=XXXX.com 了。
我很懒,直接不用变量,把参数写死到里面了,脚本就正常了。 
Missing = in header key=value
https://github.com/h2o/h2o/issues/1267
手动缓存 OCSP 响应确实解决了大部分的浏览器访问问题,但是我发现 Chromium 系的谷歌浏览器和新版 edge 在 IOS 系统下就算开启了服务器 OCSP 装订还是会去验证 OCSP,导致访问卡顿,不过好在超时时间比较短只有 2s,估计是谷歌浏览器的 bug,暂时没有解决办法
,谷歌不是不验证 OCSP 吗,在 IOS 系统下怎么这么老实了 
前一阵在 Twitter 上看到有人说 iOS 这个事情了。
好象是 iOS 在系统层面也会验证 OCSP,即使你用任何浏览器,系统都会去验证之类的。