OCSP是在线证书状态协议(Online Certificate Status Protocol)的缩写 ,是一个用于获取 X.509 数字证书撤销状态的网际协议,用于检验证书合法性。OCSP 查询需要建立一次完整的 HTTP 查询请求,期间的 DNS 查询、建立 TCP 连接、服务端响应和数据传输都是额外开销,使得建立 TLS 连接花费更多时长。后来出现了OCSP Stapling ,将原本需要客户端发起的 OCSP 请求转嫁给服务端,并随证书一起发送给客户端,因此能提高 TLS 握手效率。

今天在 SSL Labs 网站上检查网站的SSL配置,意外发现OCSP Stapling没有开启:

网站的OCSP Stapling未开启
网站的OCSP Stapling未开启

印象中Nginx配置中记得有加 ssl_stapling onssl_stapling_verify on 两个配置,怎么突然就不起作用了呢?

带着疑问进行谷歌搜索,在Jerry Qu的网站上找到了原因:之前本站一直用的Let’s encrypt签发的免费证书,其OCSP Response不包含Certificate信息,因此ssl_stapling_verifyssl_trusted_certificate两个配置无需设置,ssl_stapling on 开启即可;后来本站证书更新为阿里云申请的免费证书,由DigiCert Inc签发,需要配置ssl_trusted_certificate才能成功开启OCSP Stapling。

于是更改Nginx站点的配置为:

server {
    ....  一些常规配置
    # OCSP stapling配置
    ssl_stapling on;
    ssl_stapling_verify on;
    # ssl证书配置
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    ssl_trusted_certificate  /path/to/cert.pem;

    # 证书校验域名dns服务器
    resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=600s;
}

修改后使用systemctl restart nginx重启Nginx,在 SSL Labs  网站或者用openssl客户端都能验证OCSP Stapling已经成功开启:

openssl验证OCSP Stapling已经开启
openssl验证OCSP Stapling已经开启

openssl验证OCSP Stapling开启的命令是: openssl s_client -connect 域名:端口 -servername 域名 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response",已开启的输出如上,未开启则输出“OCSP response: no response sent”

经过上述配置,本站以及 v2ray客户端trojan客户端ssr客户端 和 shadowsock客户端 的下载服务器均已经开启OCSP配置,用户访问这些网页时速度上应该有非常轻微的提升😊

参考

1. 从无法开启 OCSP Stapling 说起