给Let’s encrypt颁发的SSL证书开启OCSP stapling

在iPhone等客户端打开Let’s encrypt证书的https网站,会出现等待时间过长的问题,究其原因,大概是,https握手的时候,浏览器会去找证书颁发者问,目前已经吊销的证书列表有哪些。Let’s encrypt的服务器在海外,因为神秘力量作用,“查已吊销”动作非常耗时。

Let’s encrypt证书免费到香的不行,配合上计划任务,只要服务器不欠费情况下,可以自动续期,全程做到无需人工介入,这点比花钱的单域名证书香太多了。

网络上查询一段时间,发现有个技术叫“OCSP stapling”。先解释一下OCSP:

OCSP 是一个在线证书查询接口,它建立一个可实时响应的机制,让浏览器可以实时查询每一张证书的有效性,解决了 CRL 的实时性问题,但是 OCSP 也引入了一个性能问题,某些客户端会在 SSL 握手时去实时查询 OCSP 接口,并在得到结果前会阻塞后续流程,这对性能影响很大,严重影响用户体验。(OCSP 地址也在证书的详细信息中)

再解释一下OCSP Stapling:

OCSP Stapling 就是为了解决 OCSP 性能问题而生的,其原理是:在 SSL 握手时,服务器去证书 CA 查询 OCSP 接口,并将 OCSP 查询结果通过 Certificate Status 消息发送给浏览器,从而让浏览器跳过自己去验证的过程而直接拿到结果,OCSP 响应本身有了签名,无法伪造,所以 OCSP Stapling 既提高了效率也不会影响安全性。另外服务器有更好的网络,能更快地获取到 OCSP 结果,同时也可以将结果缓存起来,极大的提高了性能、效率和用户体验。

接下来直接上在nginx中,虚拟主机配置OCSP Stapling

先在服务器上找到三个证书文件:www.aa.com.key www.aa.com.pem

另外一个文件可能叫ca.cer

在Windows上打开这个文件是长这样的:

Windows打开查看

在mac预览的时候,长这样:

Mac预览

其实就是Let’s Encrypt 给咱们颁发证书的上一级证书的公钥证书

准备好了三个证书后,在server_name 同一层加如下配置:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /usr/local/nginx/conf/ssl/your.domain.com/ca.cer;
resolver 8.8.8.8 8.8.4.4 114.114.114.114 114.114.115.115 valid=60s;
resolver_timeout 2s;

配置完毕后,执行nginx -t检查一下有没有语法错误,再nginx -s reload走一下

找一台iPhone 打开网站看看速度有没有飞快许多

参考链接:
https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol#Browser_support
https://www.feiniaomy.com/post/156.html
https://www.sohu.com/a/204468378_612370
https://www.jianshu.com/p/540124f370e0