共计 6523 个字符,预计需要花费 17 分钟才能阅读完成。
简介
在 PKI(public key infrastructure) 公钥设施根底体系中,所有的所有操作都是围绕着证书和密钥的,它提供了创立、治理、散发、应用、存储和撤销数字证书以及治理公钥加密所需的一组角色、策略、硬件、软件和程序。
有了密钥,就能够依据密钥制作证书了。要想证书能够被宽泛的应用,一个通用的规范必定是少不了的,在 PKI 体系中,这个证书的规范就叫做 X.509。
X.509 规范定义了公钥证书最罕用的格局。
一个证书的例子
证书中最次要就是公钥信息,从证书中提取公钥,能力应用公钥去解密发送者应用私钥加密过的数据。公钥信息是证书的外围。
除了公钥之外,证书蕴含了很多其余的信息,比方蕴含了身份信息 (主机名、组织或集体等)。
创立证书非常简单,咱们先看一个应用 openssl 命令来创立证书的例子。
创立证书之前,首先须要创立证书依赖的公钥和私钥,x.509 证书能够反对多种公钥私钥算法,比方 RSA, DSA, ECDSA, ed25519 等。
这里咱们抉择应用 RSA 算法,生成密钥对如下:
openssl genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
...............++++++
.............................................++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
输出 pass, 咱们能够失去 ca.key,这是一个 RSA PRIVATE KEY。
接下来就能够用这个 ca.key 来创立证书。
openssl req -new -x509 -days 20 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:SH
State or Province Name (full name) []:SH
Locality Name (eg, city) []:SH
Organization Name (eg, company) []:HW
Organizational Unit Name (eg, section) []:HW
Common Name (eg, fully qualified host name) []:caserver
Email Address []:flydean@163.com
能够看到,在密钥的根底上,证书还须要提供例如 Country Name,Province Name,Organization Name 等额定信息。
最初,咱们能够失去一个 CA 证书 ca.crt。
如果想要查看证书的状态,能够应用上面的命令:
openssl x509 -noout -text -in ca.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 9511149647544559472 (0x83fe64365379a770)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=SH, ST=SH, L=SH, O=HW, OU=HW, CN=caserver/emailAddress=flydean@163.com
Validity
Not Before: Apr 27 06:33:16 2022 GMT
Not After : May 17 06:33:16 2022 GMT
Subject: C=SH, ST=SH, L=SH, O=HW, OU=HW, CN=caserver/emailAddress=flydean@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
00:9f:b4:ff:16:15:51:2a:de:2f:23:cd:7d:27:41:
3c:30:1f:f3:cb:bf:3f:7c:96:ba:c3:81:a8:eb:88:
be:11:31:03:6f:c3:1d:f1:dc:4c:ea:3d:da:15:24:
59:32:8b:7e:87:a0:0b:57:b9:79:e4:72:2f:4b:50:
9d:00:eb:ee:52:24:f3:e8:e9:92:1c:ec:47:d9:98:
8c:f9:0f:71:a6:91:b2:5b:c1:59:bf:1f:27:47:6b:
9c:ce:22:e7:9d:2c:4a:3a:83:72:43:47:5d:ee:9e:
64:78:cb:3c:48:af:27:08:c1:08:41:c0:e0:92:e9:
13:81:1c:c7:72:3c:2f:5f:f3
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
68:09:be:cb:89:c0:0d:27:d2:bb:b2:f0:fb:6e:e2:0a:19:86:
92:cf:e5:90:48:b7:99:02:f1:75:6a:6d:79:1e:18:c7:95:7c:
89:92:ed:a1:bf:ad:91:76:c6:63:59:bb:6d:31:1e:11:5a:5e:
32:86:12:89:00:69:d0:77:c6:d6:69:11:0a:f7:7b:61:6e:95:
f8:d6:6b:89:c0:6c:49:eb:38:d9:f5:82:43:32:6e:14:fb:a0:
fb:be:12:a5:dc:69:66:b8:1b:22:cb:0f:9f:56:52:40:6d:48:
b6:78:29:dc:67:aa:79:c5:00:e3:68:9a:65:9a:94:99:be:ce:
b0:d2
能够看到 CA 证书中蕴含了日期,序列号,签名算法,发行者,有效性等额定的信息。
下面生成的证书实际上是一个根证书,这个根证书能够对其余的证书申请进行签名,从而生成子证书, 从而产生了证书的级联构造。
如果一个客户端想要向 CA server 申请一个新的证书该怎么做呢?
首先客户端也须要生成本人的密钥对。如果客户端是 CA server 本人,那么这个申请 CA 证书的过程叫做自签名。
要想申请证书,首先得生成一个申请 csr,同样能够应用 openssl 命令来进行:
openssl req -new -key ca.key -out server.csr
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:CN
State or Province Name (full name) []:SH
Locality Name (eg, city) []:SH
Organization Name (eg, company) []:citi
Organizational Unit Name (eg, section) []:org
Common Name (eg, fully qualified host name) []:client
Email Address []:flydean@163.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
csr 申请因为也是须要生成一个 CA 证书,所以也须要输出相似的信息。
最初咱们生成了一个 server.csr 文件。
接下来应用这个 csr 文件去申请证书:
openssl x509 -req -days 20 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=SH/L=SH/O=citi/OU=org/CN=client/emailAddress=flydean@163.com
Getting CA Private Key
Enter pass phrase for ca.key:
下面命令的含意是 CA server 上的 private key,根证书和刚刚生成的证书申请 server.csr,生成应用 CA server 签名的自签名证书。
最初失去一个自签名 server.csr 证书文件。
同样应用 openssl 命令查看该证书状态:
openssl x509 -noout -text -in server.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 14663444799761243679 (0xcb7f055ae9515e1f)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=SH, ST=SH, L=SH, O=HW, OU=HW, CN=caserver/emailAddress=flydean@163.com
Validity
Not Before: Apr 27 07:28:08 2022 GMT
Not After : May 17 07:28:08 2022 GMT
Subject: C=CN, ST=SH, L=SH, O=citi, OU=org, CN=client/emailAddress=flydean@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
00:9f:b4:ff:16:15:51:2a:de:2f:23:cd:7d:27:41:
3c:30:1f:f3:cb:bf:3f:7c:96:ba:c3:81:a8:eb:88:
be:11:31:03:6f:c3:1d:f1:dc:4c:ea:3d:da:15:24:
59:32:8b:7e:87:a0:0b:57:b9:79:e4:72:2f:4b:50:
9d:00:eb:ee:52:24:f3:e8:e9:92:1c:ec:47:d9:98:
8c:f9:0f:71:a6:91:b2:5b:c1:59:bf:1f:27:47:6b:
9c:ce:22:e7:9d:2c:4a:3a:83:72:43:47:5d:ee:9e:
64:78:cb:3c:48:af:27:08:c1:08:41:c0:e0:92:e9:
13:81:1c:c7:72:3c:2f:5f:f3
Exponent: 65537 (0x10001)
Signature Algorithm: sha1WithRSAEncryption
31:2e:b6:d7:3e:2d:ae:f1:2e:44:b5:5e:73:42:91:39:80:9f:
a8:ed:9c:60:78:35:21:df:4a:45:b0:b1:d1:80:c1:ee:cb:30:
75:34:66:61:43:6c:0a:85:4f:a3:e5:09:9f:2b:07:62:6a:3a:
60:22:78:f0:7d:32:ef:2f:46:95:34:60:22:03:47:78:6f:0c:
7e:f1:85:ea:d6:4b:1e:45:b5:56:a1:d7:52:9c:19:ae:24:26:
3d:a7:0b:f2:94:c1:d3:e3:04:25:f8:ce:b8:cb:84:6a:d1:b4:
63:7c:df:87:f8:44:86:49:b5:96:dc:43:c7:7a:17:d3:82:c6:
6a:af
能够看到构造和 root ca 证书是一样的,这里的 Subject 是创立 server.csr 中输出的信息。
X.509 证书的后缀
下面咱们应用的证书后缀是 crt,也就是 certificate 的缩写。
事实上 X.509 证书还反对其余几种类型的后缀。
.pem
pem 的全称是 Privacy-enhanced Electronic Mail,从名字能够看出,pem 最后是为加密邮件筹备的。
它是一种以 DER+Base64 进行编码的证书。PEM 证书通常是文本格式,以 ”—–BEGIN CERTIFICATE—–“ 结尾,并以 ”—–END CERTIFICATE—–“ 完结。
.cer, .crt, .der
这三个都是以 DER 进行编码的二进制证书,但有时候也会应用 Base64 进行编码,比方.pem。
.p7b, .p7c
是用 PKCS#7 进行签名的数据。
PKCS 全称是 Public-Key Cryptography Standards,是由 RSA 实验室与其它平安零碎开发商为促成公钥明码的倒退而制订的一系列规范。
PKCS#7 的全称叫做 Cryptographic Message Syntax Standard。
.p12
是用 PKCS#12 签名的数据,能够同时蕴含证书和私钥。
.pfx
PKCS#12 的前身, 通常蕴含 PKCS#12 格局的数据。
证书的层级构造和穿插认证
证书的层级构造应该很好了解了,证书的层级构造又叫做证书链。
从咱们收到的最终证书开始,前面能够跟一个或者多个 CA 证书,最初一个证书是根证书。
比方当初证书的链式构造是 A ->B->C。
要想校验 A 证书的有效性,那么须要应用到 B 的公钥来验证,那么 B 的有效性,同样须要用到 C 的公钥来验证,这样层级验证始终到根证书为止。
什么是穿插认证呢?
如果当初有 A ->B 和 D ->E 这两条证书链。然而当初这两条链是独立的, 如果 A 证书也想应用 E 来进行认证应该怎么解决呢?
先来思考下 A ->B 的含意,A->B 意思是 A 证书应用 B 证书来签名的。更确切的说就是 A 证书是用 B 证书中的公钥来进行签名的。
如果咱们应用 E 对 B 中的公钥进行签名失去一个证书 C,那么 B 和 C 领有雷同的公钥,所以对于 A 来说,A->B 和 A->C->E 都是无效的证书链。
如果应用 B 对 E 的公钥进行签名,失去证书 F,那么对于 D ->E 和 D->F->B 同样是两条无效的证书链。
这样的构造就叫做穿插认证。
穿插认证用在不同根 CA 链相互认证的场景,十分有用。
x.509 证书的应用范畴
x.509 证书应用范畴十分宽泛,比方 web 拜访中最常见的 TLS/SSL 和 HTTPS 都是用的是 x.509 证书。
另外 SMTP, POP, IMAP, LDAP, XMPP 提供了对 x.509 证书的反对。
总结
以上就是 x.509 证书的应用和相干原理的介绍。
更多内容请参考 http://www.flydean.com/42-pki-x509/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!