提醒:本文最后更新于 1705 天前,文中所描述的信息可能已发生改变,请仔细核实。
OCSP(Online Certificate Status Protocol,在线证书状态协议)可以理解为是一个在线查询接口,客户端(如浏览器)可以通过它实时查询单个证书的合法性(多为确认证书是否被作废)。
使用“OCSP Stapling”主要是为了某些客户端会在TLS握手阶段进一步协商时,实时查询OCSP接口,并在获得结果前阻塞后续流程,这对握手效率影响很大。而OCSP Stapling是指服务端在证书链中包含颁发机构对证书的OCSP查询结果,从而让客户端跳过验证的过程。(工作流程参考上图)
OCSP响应本身经过了数字签名,无法伪造,所以OCSP Stapling既提高了握手效率,又不会影响安全性。对外提供访问的网站是比较推荐开启的。
但因为Nginx在实现OCSP Stapling这部分逻辑时,直接使用了OpenSSL库,使得Nginx使用BoringSSL时便不支持OCSP Stapling。
那么如何解决这个问题呢?
首先需要个Patch,早在2018年,热心网友Carter Li便在我的Patch项目中提供了补丁来解决这个问题。它为Nginx添加了使用ssl_stapling_file
参数给BoringSSL提供OCSP stapling支持。
这个Patch的传送门。为Nginx打上补丁后,使用BoringSSL即可通过指定ssl_stapling_file来支持OCSP stapling。
但这又产生了新的问题,OCSP stapling file需要手动创建,而且是有有效期。你需要不断更新,以确保客户端不会读取到过期的数据。虽然有效期有一周,但也较为麻烦,带来了不必要的工作量。
所以我写了个shell脚本,如下。利用at(一个cron应用)来自动更新OCSP stapling file。
#!/bin/sh
openssl ocsp -no_nonce \
-CAfile /path/to/root.crt \
-VAfile /path/to/root.crt \
-issuer /path/to/issuer.crt \
-cert /path/to/server.crt \
-respout /path/to/ocsp.resp \
-url "$(openssl x509 -in /path/to/bundle.crt -text | grep "OCSP - URI:" | cut -d: -f2,3)" \
> /tmp/ocsp.reply 2>&1
at $(date -d "$(cat /tmp/ocsp.reply | grep 'Next Update: ' | awk -F': ' '{print $2}') + 1 minutes" +"%H:%M %Y-%m-%d") < ~/ocsp.cron.sh
service nginx reload
exit
其中:
1.~/ocsp.cron.sh
为本脚本具体位置。
2./path/to/root.crt
为你所申请证书的Root CA证书。
3./path/to/issuer.crt
为你所申请证书的中间链证书。
4./path/to/server.crt
为你所申请的证书。
5./path/to/bundle.crt
为你所申请含中间链的证书(issuer.crt与server.crt合并可得)。
6./path/to/ocsp.resp
为你给Nginx ssl_stapling_file参数指定的OCSP响应文件。
以上,请按照你的实际存储位置、文件名字、具体情况更改。
脚本主要作用是生成ocsp.resp为Nginx所用,并且在产生文件时,以OCSP回应的过期时间+1分钟创建定时任务重建ocsp.resp并产生新的计划任务后重启Nginx。也就是说至多有一分钟,你的OCSP stapling file是过期的,但这保证了重建成功。
启动服务器后,脚本一次运行后就可以不管了,自动循环创建任务,高效快捷(王婆卖瓜)。可以通过添加脚本到系统自启动,达到无感体验。(AT重启后也能任务保持,不需要添加脚本到自启动,只需要运行一次即可)
定时任务使用到了at,可以通过包管理直接安装。
Nginx的配置中只需要增加一行:
ssl_stapling_file /path/to/ocsp.resp;
即可完成(记得根据实际位置和文件名字,修改路径)。
需要注意的是,指定OCSP stapling file的方式仅支持单证书(无法同时支持RSA/ECC双证书)。
更多关于OCSP的知识,可以看屈哥博客的这篇文章:《从无法开启 OCSP Stapling 说起》。
转载请注明转自:kn007的个人博客的《让Nginx使用BoringSSL时支持OCSP Stapling》