前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx开启OCSP的弊端以及优化方案

Nginx开启OCSP的弊端以及优化方案

原创
作者头像
ICU
发布2022-04-24 18:01:24
3.1K1
发布2022-04-24 18:01:24
举报
文章被收录于专栏:我和你

摘要

前面有写利用《Nginx开启OCSP以解决Let's Encrypt证书被DNS污染访问缓慢》的问题,这篇文章总结和优化一下一些会出现的问题。

正文

一、弊端

此方式实现了OCSP查询在服务器端进行,避免了浏览器去进行OCSP验证从而影响访问速度; 但是OCSP响应的缓存并不是预加载的,而是异步加载的; 在Nginx启动后,只有当有客户端访问的时候,Nginx才开始去请求OCSP响应并缓存到本地,并且当OCSP响应缓存过期的时候并不会去主动更新,而是等待客户端访问异步触发的更新; 这样就会导致总会有几次访问并没有走OCSP响应缓存从而导致还是会有访问速度缓慢的情况发生。

二、优化

那如何解决呢? 最好的办法就是我们人工去请求OCSP响应并保存到本地,Nginx直接加载保存好的响应信息就行了; 这里我自己编写了Shell脚本去定时请求OCSP响应信息并保存到本地,利用 Nginx 的 ssl_stapling_file 指令直接读取本地响应信息,这样就不会去实时查询证书的OCSP服务器,在进行SSL握手的时候直接将本地的响应信息进行下发,极大的加快了访问速度。

开始优化

1.更改服务器DNS解析服务器 由于Let's Encrypt证书DNS解析被污染,在服务器上也是无法直接访问Let's Encrypt的OCSP验证域名的,解决访问有两个 一:我们更改服务器的DNS解析服务器为8.8.8.8等国外公共服务器 二:直接修改本地Hosts,指定OCSP域名ocsp.int-x3.letsencrypt.org的IP地址 这里我选择第二种,直接修改本地Hosts文件

代码语言:javascript
复制
//编辑Hosts文件
vi /etc/hosts
//添加如下信息
175.45.42.218 ocsp.int-x3.letsencrypt.org

这里列举出来一些常用的ocsp.int-x3.letsencrypt.org服务器IP地址

代码语言:javascript
复制
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.编写Shell脚本去获取OCSP响应 直接在指定目录vim getOCSP.sh,输入以下脚本信息(仅在CentOS7 x64系统下实测过没问题,其他系统请自行测试):

代码语言:javascript
复制
#!/bin/sh
SITE=$1
if [ ! $1 ]; then
  echo "请输入查询域名!正确打开方式:sh getOCSP.sh abc.com"
  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.sh,直接修改脚本中的: acme.sh安装目录:LEDIR OCSP 响应保存文件地址:OUTDIR 日志文件地址:LOGFILE 并确保输入的目录已经创建好。

如果要获取指定证书文件的OCSP响应,则需要自己手动修改对应的证书目录和OCSP服务器地址等。

3.运行脚本

代码语言:javascript
复制
//添加可执行权限
chmod +x getOCSP.sh
//运行脚本
./getOCSP.sh abc.com
//PS:后边的参数为需要获取OCSP响应的域名

运行后就会在指定的目录生成OCSP响应文件了

4.Nginx读取OCSP响应文件

这时的Nginx配置就比上边的方式要简单许多了

代码语言:javascript
复制
ssl_stapling on;
ssl_stapling_verify on;
//OCSP响应文件地址
ssl_stapling_file /xxx/xxx/xxx/xxx/xxx/live/abc.com.ocsp.resp;

重启Nginx后,OCSP响应的预加载就完成了 这时再去检测下SSL证书状态

5.配置crontab定时任务,每日自动刷新OCSP缓存 虽然我们本地预加载了OCSP响应缓存,但是OCSP响应也是有生效时间了,超过有效时间就得重新获取,这里我们可以配置crontab定时任务去每日自动刷新OCSP响应缓存

代码语言:javascript
复制
//编辑crontab定时任务
crontab -e
//添加如下命令
#每日2:22分刷新OCSP缓存
22 2 * * * /root/getOCSP.sh abc.com > /dev/null 2>&1

这样crontab定时任务就配置完成

至此我们的Nginx OCSP装订工作就到此完成~

完结

以上就是Nginx开启OCSP的弊端以及优化方案的内容,欢迎小伙伴们交流讨论。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 正文
    • 一、弊端
      • 二、优化
        • 开始优化
          • 3.运行脚本
            • 4.Nginx读取OCSP响应文件
            • 完结
            相关产品与服务
            SSL 证书
            腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档