kn007的个人博客
♥ You are here: Home > 软件与网络 > VPS > 让Nginx使用BoringSSL时支持OCSP Stapling

让Nginx使用BoringSSL时支持OCSP Stapling

by | 8 Comments

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

donate
有所帮助?

Comments

8 Comments立即评论
  1. LV1回复

    《更新到支持OCSP的BoringSSL》 ;-)

    1. MOD回复

      @一曲长歌辞烟雨: :o 卧槽。。这也行

  2. 更新到BoringSSL下支持OCSP ;-)
    OCSP封套这个东西,如果不手动更新的话,Nginx获取它是异步的,解决方法看来只能用脚本了 :!:

    1. MOD回复

      @云间守望: 是的。
      不是,你怎么也更新至 :sad:

  3. 回复

    您可以显示一个使用“ LetsEncrypt”执行此操作的示例吗?

    如果可能,请使用2“ nginx_vhost”。

    非常感谢!

  4. 回复

    问一下,CloudFlare的QUIC实现是不是和谷歌chromium那个不一样啊,感觉chrome好像不支持的样子 :razz:

    1. MOD回复

      @Zxilly: 不一样,可以支持

    2. MOD回复

      @Zxilly: 因为你想的是quic,但其实我们说的是http3

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif