OCSP Stapling的一些小实践

in Tutorials with 5 comments

这篇文章算是对这篇文章《Nginx的SSL配置优化》的一个补充,因为上面用到了OCSP Stapling,没有作太多的解释。所以补上,而且刚好看到Jerry Qu的这篇文章 via ,看了几遍,也看了一些其他的,大概简单介绍,详情请浏览他的文章。这里只简单引用介绍:

OCSP(Online Certificate Status Protocol,在线证书状态协议)是用来检验证书合法性的在线查询服务,一般由证书所属 CA 提供。某些客户端会在 TLS 握手阶段进一步协商时,实时查询 OCSP 接口,并在获得结果前阻塞后续流程。OCSP 查询本质是一次完整的 HTTP 请求 - 响应,这中间 DNS 查询、建立 TCP、服务端处理等环节都可能耗费很长时间,导致最终建立 TLS 连接时间变得更长。

而 OCSP Stapling(OCSP 封套),是指服务端主动获取 OCSP 查询结果并随着证书一起发送给客户端,从而让客户端跳过自己去验证的过程,提高 TLS 握手效率。

这里的实践环境是CentOS7,SSL的证书是Comodo Positive SSL,

配置OCSP Stapling

先串联一个pem文件,文件含有中间证书和根证书,因为Comodo Positive SSL是有两个中间证书,依次从子到父串联好,不需要站点证书

cat COMODOECCDomainValidationSecureServerCA.crt COMODOECCAddTrustCA.crt AddTrustExternalCARoot.crt > chaine.pem

串联生成的 chaine.pem 放在你想放的目录下,我是放在 /usr/local/nginx/conf/vhost/sslkey

然后打开你的Nginx的站点配置文件,假设我的配置文件是在 /usr/local/nginx/conf/vhost 的目录

vim /usr/local/nginx/conf/vhost/www.linpx.com.conf

server{} 的括号内加入

ssl_trusted_certificate /usr/local/nginx/conf/vhost/sslkey/chaine.pem;
ssl_stapling on; 
ssl_stapling_verify on;

resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

检查是否生效

方法一

执行下面命令,域名换成你的即可

openssl s_client -connect www.linpx.com:443 -showcerts < /dev/null 2>&1

列出一堆信息后,拉到最后

    Start Time: 1243052074
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

或者是

    Start Time: 1457861201
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

我在两台机子测试,一台是国内,另外一台是国外,测试图如下:

20160315204818.png

如果是 code:20 的情况,可以 将 https://www.terena.org/activities/tcs/repository/AddTrust_External_CA_Root.pem 这文件存为 root.pem,再指定 -CAfile 去测试,如

openssl s_client -CAfile root.pem -connect www.linpx.com:443 -status -tlsextdebug < /dev/null 2>&1

返回

    Start Time: 1243052074
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

之所以会有 code:20 ,在Stack Overflow上检索了一下相关问题,如 http://stackoverflow.com/questions/21161079/openssl-unable-to-get-local-issuer-cert-return-code-20 还是不思其解··· 但应该好像没问题的吧···下回分解···

方法二

这个方法有点类似于在 https://ssllabs.com/ssltest/index.html 上做的测试···

打开 https://www.digicert.com/help/ ,输入你的域名在唯一可见文本框内,回车

等一会,查看状态

如我的linpx.com

20160315203844.png

更新(2016年3月15日20:13:13)

修改了因为认识不够充分的错误语句。

参考

Responses
  1. grlove

    站长的主题很不错,非常喜欢你的分享,希望可以保持更新!

    Reply
    1. @grlove

      谢谢 :P

      Reply
  2. 昨天又研究了下,发现 ubuntu 实际上是有那个根证书的,但是不知道为什么不会使用。我的 RapidSSL 就没问题。

    $ openssl x509 -in /usr/share/ca-certificates/mozilla/AddTrust_External_Root.crt -noout -subject

    subject= /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root

    Reply
    1. @Jerry Qu

      我用国外的vps,系统是CentOS6 测试一下 直接通了······· code 0

      Reply
    2. @Jerry Qu

      额,浏览了一下在 Stack Overflow 的相关问题,好像仅仅对GeoTrust Certificate是有效的。

      http://stackoverflow.com/questions/21161079/openssl-unable-to-get-local-issuer-cert-return-code-20 这篇文章针对Google的也是一样code 20

      Reply