让Nginx使用BoringSSL时支持OCSP Stapling

提醒:本文最后更新于 1470 天前,文中所描述的信息可能已发生改变,请仔细核实。

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/patchSomething could be public patches

转载请注明转自:kn007的个人博客的《让Nginx使用BoringSSL时支持OCSP Stapling