OCSP是在线证书状态协议(Online Certificate Status Protocol)的缩写 ,是一个用于获取 X.509 数字证书撤销状态的网际协议,用于检验证书合法性。OCSP 查询需要建立一次完整的 HTTP 查询请求,期间的 DNS 查询、建立 TCP 连接、服务端响应和数据传输都是额外开销,使得建立 TLS 连接花费更多时长。后来出现了OCSP Stapling ,将原本需要客户端发起的 OCSP 请求转嫁给服务端,并随证书一起发送给客户端,因此能提高 TLS 握手效率。
今天在 SSL Labs 网站上检查网站的SSL配置,意外发现OCSP Stapling没有开启:
印象中Nginx配置中记得有加 ssl_stapling on
和 ssl_stapling_verify on
两个配置,怎么突然就不起作用了呢?
带着疑问进行谷歌搜索,在Jerry Qu的网站上找到了原因:之前本站一直用的Let’s encrypt签发的免费证书,其OCSP Response不包含Certificate信息,因此ssl_stapling_verify
和ssl_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 s_client -connect 域名:端口 -servername 域名 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
,已开启的输出如上,未开启则输出“OCSP response: no response sent”
经过上述配置,本站以及 v2ray客户端、trojan客户端、ssr客户端 和 shadowsock客户端 的下载服务器均已经开启OCSP配置,用户访问这些网页时速度上应该有非常轻微的提升?