记一次 https CA 中间证书的问题处理

公司CDN切换到一家新的服务商,原本切换很简单,没想到在证书上,还是遇到了些问题,这里记录下。

证书

说到证书,就有必要说下具体的涉及东西。

一般申请网站证书,都会有三样东西:

  • 私钥,也就是密钥了,这个可以自己生成好,再去申请,也可以直接通过第三方直接生成
  • 公钥-域名证书,这个是针对你的域名的,公开的
  • 公钥-CA中间证书,这个可能不会提供,可以自己获取到

其中私钥是不能泄露的,剩下的公钥,就是要公开的。密钥严格来讲,最好自己生成。

像我这么懒的人,一般都是选择浏览器自动生成CSR。

CA证书就是颁发域名证书的机构,比如叫做B机构。B要想证明你的域名证书有效,就要提供自己的证书。同理,B甚至需要更高一级A机构来证明自己。这样CA中间证书可能不止一个。

CA中间证书,一般我见过的绝大部分都是一个就行了,偶尔遇到过两个的,超过两个的暂时没见过。

其中公钥(域名证书、CA证书)可以合并,将所有的公钥按顺序拼接就好。所以如果你的公钥只有一个文件,可以打看看下,是不是有多个段落。一般拼接好的证书,叫做链式证书(full_chain)。

这里就要有个经验了,不知道为啥,拼接两个证书的时候,都是域名证书在上,CA证书在下。顺序反了的话,可能有兼容性问题,比如 nginx 不识别啥的。

证书存储上,我认为直接保存链式证书比较方便,因为域名证书和CA证书混在一起,你可能后续就分不清了。

经验所谈,一般内容较长的是域名证书,短一点的是CA证书。你可以看下自己的证书,是不是如此。

商用证书

自己弄的免费证书和花钱买的还真可能不一样。比如 FreeSSL 免费生成的,最终都是这样的结果:

img

区分好了私钥、以及公钥的域名证书和CA中间证书。而且格式pem rsa的,直接就可以使用。更方便的是,如果点击下载,还会帮你把域名证书和CA中间证书整合在一个文件。

买的商用证书就不一样了,首先不知道是什么加密格式,私钥是不太一样的,同时配套给了一个密码(当时研究出来了,现在只有上帝知道)。而且还遇到了上文提到的,不提供CA证书。

现在猜测应该是 pkcs 加密证书,因为解密后,就不想保留原有加密的内容了。

对于一些常规的 CDN 或者服务器证书配置,好像还可以支持,但是大部分情况,都需要转换下。由于我司的证书年代久远,当时转换方法我也就记不得了。总之很多时候都靠猜和运气。

CA中间证书的获取

对于一些厂商可能不提供CA中间证书,这个也不用怕,因为都是公开的证书,可以获取的。

当时获取我司的签发机构证书忘记了如何操作的。现在查询了下,大概有两种方法。

浏览器查看并导出法

这个原本 chrome 也支持的,但是好像某一个版本之后功能改版了,就不能导出了。

现在主流的方案都是用 Firefox 来导出。

img

在访问的域名前,点击绿色标志,并选择右箭头的功能。之后选择 “更多信息”。

img

弹出证书框后,选择“安全”选项卡,里面就有“查看证书”。证书查看器中,有“详细信息”选项卡,里面有“导出”功能。支持导出域名证书以及证书链。

这个方法好处是非常直观,导出的也是我们常见的pem(也可以导出其他格式)。

缺点也很明显,假如这个网站是中间跳转页,那么一瞬间就跳转走了,根本没办法点击是不是…你说气人不…

openssl 导出法

这个方法我玩的不是很溜,仅仅是知道有这么个方法,供参考吧。

安装工具类 openssl 之后,可以用命令查询证书。

1
openssl s_client -connect host:port -showcerts

比如查询我的网站就是:

1
openssl s_client -connect www.yukapril.com:443 -showcerts

可以返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
CONNECTED(00000005)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Encryption Everywhere DV TLS CA - G1
verify return:1
depth=0 CN = img.ucdl.pp.uc.cn
verify return:1
---
Certificate chain
0 s:/CN=img.ucdl.pp.uc.cn
【注册时的邮箱】:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1
-----BEGIN CERTIFICATE-----
MIIHJTCCBg2gAwIBAgIQDypRrHvTErPCp3dELPGfVDANBgkqhkiG9w0BAQsFADBu
...省略...
-----END CERTIFICATE-----
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1
【注册时的邮箱】:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
...省略...
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=img.ucdl.pp.uc.cn
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1
---
No client certificate CA names sent
Server Temp Key: ECDH, X25519, 253 bits
---
SSL handshake has read 3647 bytes and written 285 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-CHACHA20-POLY1305
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-CHACHA20-POLY1305
Session-ID: 508935B5D7781D4F3ECD9FEC381D92F4AB0BFF3761F9197D2CDC4531602A3C70
Session-ID-ctx:
Master-Key: 2DADAC30A131BE41B218D22003A5A8FDF084FFB6BE78DFC8DE143F30C70672A81AD140D4586C43460404E95130FAED8A
TLS session ticket lifetime hint: 900 (seconds)
TLS session ticket:
0000 - c7 f3 15 16 ca 6f 94 ed-9e 9e 8e b7 f6 f1 53 b1 .....o........S.
0010 - 4b 1a d2 46 da ce de 85-80 18 d4 f2 76 f4 3a e8 K..F........v.:.
0020 - b5 a3 b1 0f ee 04 25 9d-e8 d0 c9 16 f4 6d 16 7c ......%......m.|
0030 - a1 8f 53 3c bb 1d 61 c4-e3 74 a4 2d d5 5c 0e 27 ..S<..a..t.-.\.'
0040 - af 72 b4 ee 0a 35 87 05-ae d5 99 db a8 9f be 1c .r...5..........
0050 - f5 ff ff 1d 8b 5b e2 ef-f4 fc ba 2c c9 fb 9d 16 .....[.....,....
0060 - 77 ba 74 b8 65 14 a9 85-cd ec c8 99 98 c0 81 3a w.t.e..........:
0070 - 22 c7 61 68 7c 51 bc d9-3b 3d 4d c3 12 e5 98 81 ".ah|Q..;=M.....
0080 - 4e d1 05 4d 38 8d b5 17-88 50 10 f2 df 64 d5 93 N..M8....P...d..
0090 - 2c 14 17 31 e2 40 b0 5e-6c 6b e6 e5 de 0a d1 a1 ,..1.@.^lk......

Start Time: 1554736914
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---

可以看到其中 Certificate chain 有两条记录,就是域名证书和CA证书了。

有时候返回的感觉不是常见的pem x509证书,比如我司的就是如此。这个就不知道如何处理了。但是采用火狐浏览器获取的,就是一定可以是常见的pem证书。所以还是推荐浏览器方案。

–END–