去年底更换了 AlphaSSL 泛域名证书,刚刚没事就在 SSL/TLS 安全评估报告 网站上检查网站的SSL配置状态,意外发现 OCSP装订 居然没有开启,怪不得谷歌站长核心网页指标的移动设备老是提示:LCP 问题:超过了 2.5 秒(移动设备),需要改进,那么就来重新开启一下吧!

OCSP 是什么?

OCSP 是在线证书状态协议(Online Certificate Status Protocol)的缩写 ,是一个用于获取 X.509 数字证书撤销状态的网际协议,用于检验证书合法性。

OCSP 查询需要建立一次完整的 HTTP 查询请求,期间的 DNS 查询、建立 TCP 连接、服务端响应和数据传输都是额外开销,使得建立 TLS 连接花费更多时长。

后来出现了 OCSP Stapling ,将原本需要客户端实时发起的 OCSP 请求转嫁给服务端,Web 端将主动获取 OCSP 查询结果,并随证书一起发送给客户端,以此让客户端跳过自己去寻求验证的过程,提高 TLS 握手效率和 HTTPS 性能。

解决方法

正常情况下在 Nginx 配置文件中增加 ssl_stapling onssl_stapling_verify on 即可开启 OCSP,但如果你使用阿里云申请的免费证书,那么就需要配置 ssl_trusted_certificate 才能开启。

Let's encrypt 免费签发的证书其 OCSP Response 不包含 Certificate 信息,因此 ssl_stapling_verifyssl_trusted_certificate 无需设置,只需开启 ssl_stapling on 即可。

开启 OCSP 完整配置内容如下:

server {
    ....
    # OCSP stapling配置
    ssl_stapling on;
    
    # Let's encrypt 无需配置
    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;
    ....
}

修改完成后使用命令重启 Nginx,然后使用 OpenSSL 来验证 OCSP Stapling 是否已经成功开启,成功提示:OCSP Response Status: successful (0x0),失败提示:OCSP Response: no response sent,如下图:

# 重启 Nginx
systemctl restart nginx

# 验证 OCSP Stapling
openssl s_client -connect 域名:端口 -servername 域名 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"

验证 OCSP Stapling 是否已经成功开启

最后总结

经过上述配置 OCSP Stapling,对于个人博客,企业网站,下载服务器使用 SSL加密证书 推荐开启 OCSP 配置,用户访问网页时速度上会有非常轻微的提升,尤其对于做谷歌搜索排名优化的站点来说,这简直就是属于加分项。

另外就是如果你开启了全站CDN加速,那么目前已知 阿里云、腾讯云、百度云 的CDN服务均支持 OCSP装订 功能,只需要勾选即可,无需另外配置。