Https证书Nginx启用OCSP Stapling的配置方法

ssl

因为最近的业务需求,需要HTTPS并保证首次访问的速度响应性,通过Chrome浏览器调试模式,发现罪魁祸首是SSL加载居然能达到3-5S,通过搜索相关资料,发现需要将OCSP stapling这一个功能配置,为什么要开启 OCSP Stapling呢,这里给大家简单介绍下:OCSP是用来校验证书合法性的在线查询服务,一般由证书所属 CA 提供。当客服端请求TLS 握手阶段进一步协商时,使用的是实时查询 OCSP 接口,所以这中间 DNS 查询、建立 TCP、服务端处理等环节就耗费了很多时间,使得建立 TLS 连接时间变得更长。
这里给大家提供一个OCSP Stapling是否成功配置在线查询:

https://www.getssl.cn/ocsp

本文教大家如何使用 openssl 这个命令行工具来配置OCSP Stapling,我这里使用的是Mac系统,我就以Mac演示了。
首先我们除了通过上诉的工具查询之外,还可以使用以下方法查询:

$ openssl s_client -connect zzzdc.com:443 -servername zzzdc.com -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"

如果回复的结果像下面这样,说明OCSP Stapling已开启:

OCSP response:
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response

反之,未开启OCSP Stapling的话则会得到以下回复:

OCSP response: no response sent

首先,我们查询ssl的中间证书:

$ openssl s_client -connect zzzdc.com:443 -servername zzzdc.com -showcerts < /dev/null 2>&1

得到以下回复:

CONNECTED(00000005)
depth=1 C = CN, O = "TrustAsia Technologies, Inc.", OU = Domain Validated SSL, CN = TrustAsia TLS RSA CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/CN=www.zzzdc.com
i:/C=CN/O=TrustAsia Technologies, Inc./OU=Domain Validated SSL/CN=TrustAsia TLS RSA CA
-----BEGIN CERTIFICATE-----
MIIFojCCBIqgAwIBA
... ...
mTZrFP092vWuhxE3eCOcoq
wlnIK/ZR
-----END CERTIFICATE-----
1 s:/C=CN/O=TrustAsia Technologies, Inc./OU=Domain Validated SSL/CN=TrustAsia TLS RSA CA
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
-----BEGIN CERTIFICATE-----
MIIErjCCA5agAwIBAgIQB
... ...
1ZeMo6XRU9B4n5VyJY
RmE=
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=www.zzzdc.com
issuer=/C=CN/O=TrustAsia Technologies, Inc./OU=Domain Validated SSL/CN=TrustAsia TLS RSA CA
---
No client certificate CA names sent
---
SSL handshake has read 3341 bytes and written 462 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 82DCF3CE4B0E319DD5671CEA259AC5CEF0E3DA5B0698066EA3182D7184495701
Session-ID-ctx:
Master-Key: 9B07925EA3F1C0B30AF64FCA757A2AAF82F15BC0BD43E4CF7C9662AC80C8B85AF9EA51FACDB4BA86AE266F4D5F69F2F1
TLS session ticket lifetime hint: 600 (seconds)
TLS session ticket:
0000 - 21 09 83 30 76 19 d6 57-b4 44 3a d0 98 c6 a6 b2 !..0v..W.D:.....
0010 - 3d dc af d3 4e 70 51 d7-3e a0 16 1c 51 ac 69 6a =...NpQ.>...Q.ij
0020 - f3 e5 7a 16 68 fe 0a 73-54 34 d0 0a 0e 43 3f b7 ..z.h..sT4...C?.
0030 - ef 8c 6d 29 08 d5 4c 46-c2 1d 0b d3 99 6f b3 df ..m)..LF.....o..
0040 - 7f de df b2 23 e4 81 39-8f eb 29 de 70 04 76 47 ....#..9..).p.vG
0050 - 08 6a db f5 08 8b 34 d5-8b af e2 46 b4 cc 8a 57 .j....4....F...W
0060 - 5f 44 26 52 ad c1 eb 30-46 bb e3 d2 1d e8 de f1 _D&R...0F.......
0070 - df 97 5c c7 28 51 06 e6-0b a9 c0 a5 cb 50 de 2b ..\.(Q.......P.+
0080 - 72 fc 23 e8 05 17 82 6c-96 1b 59 bf 49 56 cd 53 r.#....l..Y.IV.S
0090 - 0f fc 29 64 bf d7 2c ac-f9 f1 d4 e8 73 90 ff 76 ..)d..,.....s..v
00a0 - 8b 0c d5 d5 f6 be 52 aa-f9 fb bc 1a f2 81 63 93 ......R.......c.
00b0 - 2b 6b d6 97 91 ea da af-10 24 e4 0a b5 67 91 bb +k.......$...g..

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

如上查询到的ssl内容中 Certificate Chain 这一节,编号为 0 的证书是站点证书;编号为 1 的证书是中间证书。
我们只需要把这个编号为 1 的中间证书拷贝下来,接下来再到我们配置的站点查看之前的ssl证书,有两段-----BEGIN CERTIFICATE-----,上面的为域名证书,下面的为我们域名的根证书,按照子证书在上的顺序保存,把刚才查询到的中间证书 + 根证书,保存为site.pem格式的证书文件。
好了,现在只需要修改一下 Nginx 配置就完成:

# 启用OCSP stapling
ssl_stapling on;
# valid表示缓存5分钟,resolver_timeout表示网络超时时间,建议使用以下DNS
resolver 119.29.29.29 180.76.76.76 valid=300s;
resolver_timeout 5s;
# 启用OCSP响应验证,OCSP信息响应适用的证书
ssl_stapling_verify on;
# 中间证书+根证书的路径
ssl_trusted_certificate /home/ssl/site.pem;

好了,本文先写到这里,如果还有什么不明白的欢迎留言告知。