阿里云的 5 种 TLS 证书有什么区别

申请 阿里云 的 TLS 证书时候, 会发现有 5 种选择.

  • Apache
  • Nginx
  • IIS
  • Tomcat
  • Other

这五种证书, 实际上是一个东西, 但是使用的不同格式而已. 原理参考: Https 证书相关概念以及使用细节

为了验证, 我们今天做一个实验, 将这几种证书做一个转换, 首先为了方便, 我把那些下载好的证书文件重新命一个名字.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.
├── apache
│   ├── chain.crt
│   ├── myhost.crt
│   └── myhost.key
├── iis
│   ├── myhost.pfx
│   └── pfx-password.txt
├── nginx
│   ├── myhost.key
│   └── myhost.pem
├── other
│   ├── myhost.key
│   └── myhost.pem
└── tomcat
├── myhost.pfx
└── pfx-password.txt

IIS 和 Tomcat 的证书是一样的, 只是密码不同

如何验证这一点呢, 我们使用 PFX 证书验证:

1
2
3
4
5
6
7
# 查看 iis 证书信息
openssl pkcs12 -in iis/myhost.pfx -nodes > iishost.pem
# 查看 tomcat 证书信息
openssl pkcs12 -in tomcat/myhost.pfx -nodes > tomcathost.pem

# 发现两个证书的信息, 只有 localKeyID 不同. 证明两个证书文件的内容是相同的.
diff iishost.pem tomcathost.pem

Nginx 和 Other 中的文件内容完全一致, Apache 和 Nginx 的证书文件不同内容相同

Nginx 和 Other

1
2
diff nginx/myhost.key other/myhost.key
diff nginx/myhost.pem other/myhost.pem

可以发现二者完全相同.

Apache 和 Nginx

我们先对比 key 文件

1
diff apache/myhost.key nginx/myhost.key

发现 key 文件内容完全相同.

然后我们看 nginx 的 myhost.pem 文件, 里面有两部分信息组成, 内容分别为 apache/myhost.crt 和 apache/chain.crt 中的内容.

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
// Nginx myhost.pem 文件内容
-----BEGIN CERTIFICATE-----
MIIFljCCBH6gAwIBAgIQDnbuVRJHr4mxbZq5FGgnajANBgkqhkiG9w0BAQsFADBu
// ...
YIYiDnj0NsoemhmvI8r0U+l3HsZJ9tJZoNC8cNEy+m4uiXMyBCQK/aRX
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
// ...
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
-----END CERTIFICATE-----

// Apache myhost.crt 文件内容
-----BEGIN CERTIFICATE-----
MIIFljCCBH6gAwIBAgIQDnbuVRJHr4mxbZq5FGgnajANBgkqhkiG9w0BAQsFADBu
// ...
YIYiDnj0NsoemhmvI8r0U+l3HsZJ9tJZoNC8cNEy+m4uiXMyBCQK/aRX
-----END CERTIFICATE-----

// Apache chain.crt 文件内容
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
// ...
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
-----END CERTIFICATE-----

这说明 nginx 和 apache 只是对证书文件的内容组织形式不同, 其实内容完全一致.

nginx 证书的内容是先网站证书, 后 chain 证书.

IIS/Tomcat(PFX) 转换成 PEM 格式

1
2
3
4
# 过程中需要输入 password.txt 中的密码
openssl pkcs12 -in myhost.pfx -out myhost.pem -nodes

cat myhost.pem

可以看到下面是生成, 生成的 pem 证书中,

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
Bag Attributes
friendlyName: alias
localKeyID: 54 69 6D 65 20 31 35 37 33 39 35 30 35 37 39 35 37 35
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCDCoMIdpnFqpwZ
// ...
LzIrH0Na3ZSbD3ROSFewyCqHY6PijiSUXS7vsXDX03LUlQNKjwTYP3bEhQyWRMN3
DFMEMINBCfcunyGsb9q1Bc0=
-----END PRIVATE KEY-----
Bag Attributes
friendlyName: alias
localKeyID: 54 69 6D 65 20 31 35 37 33 39 35 30 35 37 39 35 37 35
subject=/CN=xxx
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1
-----BEGIN CERTIFICATE-----
MIIFljCCBH6gAwIBAgIQDnbuVRJHr4mxbZq5FGgnajANBgkqhkiG9w0BAQsFADBu
// ...
sOkME4yjAhV7H4npknuIoxqN1uPV6BsEle1MBVcQutuQYIIugklaftaAlzltl8BS
YIYiDnj0NsoemhmvI8r0U+l3HsZJ9tJZoNC8cNEy+m4uiXMyBCQK/aRX
-----END CERTIFICATE-----
Bag Attributes
friendlyName: CN=Encryption Everywhere DV TLS CA - G1,OU=www.digicert.com,O=DigiCert Inc,C=US
subject=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Encryption Everywhere DV TLS CA - G1
issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
-----BEGIN CERTIFICATE-----
MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
// ...
rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
-----END CERTIFICATE-----

与 apache, nginx, other 的证书相比, -----BEGIN CERTIFICATE----------END CERTIFICATE----- 中间的部分部分完全相同, 顺序也是先网站证书后 chain 证书.

但是有个问题, 就是 PFX 转换完的 Key 内容与 Nginx 的 Key 内容是不一致的. 除此之外, Nginx Key 以 -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY----- 标记, 但是 PFX 转换完的 Key 以 -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- 标记. 这是为什么呢?

经过一番认证, -----BEGIN PRIVATE KEY----- 是 PKCS#8 的格式, -----BEGIN RSA PRIVATE KEY----- 是 PKCS#1 也就是标准格式.

那么就涉及这两个格式的转化问题.

1
2
3
4
# pkcs#1 -> pkcs#8 可以转换成功
openssl pkcs8 -topk8 -inform PEM -in pkcs1.key -outform pem -nocrypt -out pkcs8.key
# pkcs#8 -> pkcs#1 我在 Mac, CentOS 上测试均无法转换成功
openssl pkcs8 -in pkcs8.key -nocrypt -out pkcs1.key

无论 pkcs#8 -> pkcs#1 是否转换成功, pkcs#1 标准格式是可以转化成 pkcs#8 的, 并且与 nginx key 对比是相同的.

参考文档:

证书的使用

正如上面大致介绍的

Nginx 使用 PCKS#1(标准) Key + PEM(证书+Chain), PEM(证书+Chain) 也称为 CA Bundle.

Apache 使用 Key + 证书 + Chain 证书.

IIS 和 Tomcat 使用 PFX 证书, 是 PCKS#8 Key + 证书 + Chain 打包在一起的二进制文件, 用密码进行保护.

Other, 也是以后我们在做很多授权的时候需要用的标准格式(与 Nginx 相同), 之后的服务间授权, Gitlab, K8S, Docker Registry 等等, 都需要用到 Other 这种 Key + CA Bundle 的格式.

应用拓展

在七牛云也有证书授权服务, 其中有

  • PEM 适用于 Nginx SLB
  • PEM 适用于 Apache F5
  • PEM 适用于 Haproxy
  • JKS 适用于 Tomcat, Weblogic, JBoss
  • JKS 适用于 Tomcat 8.5+
  • PKCS12(即 PFX) 适用于 IIS, xchange, 代码签名

有些是我们已经讲到的, 有些没有, 你知道怎么验证他们了么?

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.