如果最近发现iOS APP打开h5非常慢,达到5秒以上,而安卓又正常,如果刚好你又是使用了Let's Encrypt 的免费SSL服务,恭喜你,你可能是一位运营商干扰的受害者。
原因:
近期由于众所周知的原因,国内无法直接访问 Let's Encrypt 的 OSCP 域名,导致出现了不能签发证书、OCSP Stapling 失败、网页打开慢等问题。
经检查目前是 ocsp.int-x3.letsencrypt.org 的 cname 域名 a771.dscq.akamai.net 受到了干扰,可以采用本地修改hosts的方案进行临时处理。
在/etc/hosts中添加
23.32.3.72 ocsp.int-x3.letsencrypt.org
生成 OCSP Stapling 文件
经过以下步骤生成所需的用于 OCSP Stapling 验证的文件
首先,需要准备三份证书:
站点证书(website.pem)+ 根证书(root.pem)+ 中间证书(intermediate.pem)
中间证书和根证书,需要根据你的证书的 CA,去下载对应的证书
以下列出了 Let's Encrypt 的中间证书和根证书的下载地址:
根证书:
DST Root CA X3 https://ssl-tools.net/certificates/dac9024f54d8f6df94935fb1732638ca6ad77c13.pem
ISRG Root X1 https://letsencrypt.org/certs/isrgrootx1.pem
中间证书:
Let's Encrypt Authority X1 https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem
Let's Encrypt Authority X2 https://letsencrypt.org/certs/lets-encrypt-x2-cross-signed.pem
Let's Encrypt Authority X3 https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem
Let's Encrypt Authority X4 https://letsencrypt.org/certs/lets-encrypt-x4-cross-signed.pem
这里以 DST Root CA X3 根证书 + Let's Encrypt Authority X3 中间证书 为例(现在 Let's Encrypt 签发的证书基本都是这样的组合):
# 下载根证书和中间证书 wget -O root.pem https://ssl-tools.net/certificates/dac9024f54d8f6df94935fb1732638ca6ad77c13.pem wget -O intermediate.pem https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem # 生成 OCSP Stapling 验证文件 # 注意,中间证书在上、根证书在下 cat cat intermediate.pem > chained.pem cat root.pem >> chained.pem
这样,生成的 chained.pem 就是所需的 OCSP Stapling 验证文件。
如果没有 站点证书(website.pem),可以输入如下命令:
openssl s_client -connect mydomain.com:443 -servername mydomain.com-showcerts < /dev/null 2>&1
[root@hadoop-nginx .acme.sh]# openssl s_client -connect mydomain.com:443 -servername mydomain.com-showcerts < /dev/null 2>&1
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = app6.kedaqianbao.com
verify return:1
---
Certificate chain
0 s:/CN=app6.kedaqianbao.com
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
MIIFXzCCB......................................................
...............................................................
...........................................
..........
.
-----END CERTIFICATE-----
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgA..................................................
...........................................
...........................
..................
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=app6.kedaqianbao.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3246 bytes and written 444 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
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-AES256-GCM-SHA384
Session-ID: A3E868ED8A9FFC0687B8379A6AD26AA7B368FB8B270DDD6C61441485E56839A4
Session-ID-ctx:
Master-Key: C0D9365E17DA7C48053CC179D6E15C0E12FB2572C00E58725044D1A8E7B88823D7757E31C847F01543D3FD0CFB01517E
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 600 (seconds)
TLS session ticket:
0000 - 09 34 28 07 47 20 76 19-96 1c ca 19 17 3c bf 32 .4(.G v......<.2
0010 - fc 6e d7 7d 0e 44 0e 45-18 b5 a4 00 a5 8d d9 98 .n.}.D.E........
0020 - f4 18 38 9e 1b b1 58 bb-26 b5 cb 60 b2 38 9a b9 ..8...X.&..`.8..
0030 - a0 e5 8c e2 81 9a 63 95-e2 9e 71 84 29 23 65 d8 ......c...q.)#e.
0040 - 1c 4a 76 78 02 ac c4 a0-e9 5d b2 23 87 db 47 8c .Jvx.....].#..G.
0050 - e6 52 95 45 80 a4 f5 d8-c2 4f 19 1b 2f 1e 92 b7 .R.E.....O../...
0060 - 43 53 e9 a4 af 00 4f 4c-d0 11 af 7b bf 5f 90 a9 CS....OL...{._..
0070 - c6 fe 7e a8 ca ac a4 08-a8 d2 83 fb cd 4d 27 e4 ..~..........M'.
0080 - e2 0d 17 46 00 53 39 2b-c8 5d c9 15 3f 60 2a 0c ...F.S9+.]..?`*.
0090 - d9 7e f7 11 eb 75 1a 0d-a9 06 e7 f5 38 bb 2b 39 .~...u......8.+9
00a0 - f7 9d 2a 07 f4 b5 a1 29-d3 39 c2 71 3b 84 d3 f5 ..*....).9.q;...
00b0 - fa 47 4a ab 3d ae de c6-b9 e7 4a 99 2f 10 7c 0c .GJ.=.....J./.|.
Start Time: 1592291163
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
DONE
[root@hadoop-nginx .acme.sh]#
可以看到 0 和 1 两个,-----BEGIN CERTIFICATE----- 开始的 证书文本。
0、表示 站点证书
1、 表示中间证书
复制 站点证书内容(需要包含-----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----),为 website.pem 文件。
OCSP Stapling Response
openssl x509 -in website.pem -noout -ocsp_uri
使用这个命令后,返回你的证书对应的 OCSP 服务地址
例如,Let's Encrypt 现在的 OCSP 服务地址是 http://ocsp.int-x3.letsencrypt.org/
以 Let's Encrypt 为例,获取站点证书的 OCSP Response
[root@hadoop-nginx kedawenhua]# openssl ocsp -no_nonce \
> -respout /home/docker/software/nginx/conf/ssl/mydomain.ocsp_res.der \
> -issuer intermediate.pem \
> -CAfile chained.pem \
> -VAfile chained.pem \
> -cert website.pem \
> -url http://ocsp.int-x3.letsencrypt.org \
> -header "HOST" "ocsp.int-x3.letsencrypt.org"
Response verify OK
website.pem: good
This Update: Jun 16 05:00:00 2020 GMT
Next Update: Jun 23 05:00:00 2020 GMT
-respout参数 是指定OCSP 响应数据的 保存位置,将这个位置填入在 nginx 配置文件的 ssl_stapling_file 中,如下开启ssl_stapling。
这里如果出现如下错误的话,说明你的openssl使用了1.1.0版本,这个时候已经不需要指定HOST,把上面命令中的“-header "HOST" "ocsp.int-x3.letsencrypt.org"”删掉就好了。
Missing = in header key=value
ocsp: Use -help for summary.
ssl_stapling on;
ssl_stapling_verify on;
ssl_stapling_file /home/docker/software/nginx/conf/ssl/mydomain.ocsp_res.der;
重载nginx服务之后,检查是否成功开启。
openssl s_client -connect mydomain.com:443 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
如下:
最后将有关操作制成脚本,添加到 crontab 中自动更新。
重新加载H5, 会发现访问速度,基本恢复正常