目录
简介
在PKI(公钥基础设施)公钥基础设施体系中,所有的操作都围绕着证书和密钥,它们提供了数字证书的创建、管理、分发、使用、存储和撤销以及管理公共的一组角色,密钥加密所需的政策、硬件、软件和程序。
使用密钥,您可以根据密钥创建证书。如果证书能够被广泛使用,那么一个通用的标准是必不可少的。在 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
可以看到,在key的基础上,证书还需要提供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 服务器请求新证书怎么办?
首先,客户端还需要生成自己的密钥对。如果客户端是CA服务器本身,则请求CA证书的过程称为自签名。
要申请证书,首先要生成一个request 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.csr生成一个CA服务器签名的自签名证书。
最终得到一个自签名的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
可以看到结构和根ca证书是一样的。这里的Subject是创建server.csr时输入的信息。
X.509 证书后缀
我们上面使用的证书后缀是crt,是certificate的缩写。
事实上,X.509 证书支持几种其他类型的后缀。
.pem
pem的全称是Privacy-enhanced Email。从名字就可以看出,pem最初是为加密邮件准备的。
这是一个 DER+Base64 编码的证书。 PEM 证书通常采用文本格式,以“—–BEGIN CERTIFICATE—–”开头,以“—–END CERTIFICATE—–”结尾。
.cer、.crt、.der
这三个是用DER编码的二进制证书,但有时也会用到Base64编码,比如.pem。
.p7b, .p7c
是使用 PKCS#7 签名的数据。
PKCS 代表 Public-Key Cryptography Standards,是 RSA Labs 和其他安全系统开发商为促进公钥密码学的发展而制定的一系列标准。
PKCS#7 的全称是 Cryptographic Message Syntax Standard。
.p12
是使用 PKCS#12 签名的数据,可以包含证书和私钥。
.pfx
PKCS#12的前身,通常包含PKCS#12格式的数据。
证书层次结构和交叉认证
证书的层次结构应该很好理解。证书的层次结构也称为证书链。
从我们收到的最终证书开始,后面可以是一个或多个CA证书,最后一个证书是根证书。
例如当前证书的链式结构是A->B->C。
如果要验证A的证书的有效性,需要用B的公钥来验证,那么B的有效性也需要用C的公钥来验证,这样验证的级别就到root了证书。
什么是交叉认证?
假设有两条证书链 A->B 和 D->E。但是现在这两条链是独立的,如果A证书也想用E认证怎么办?
让我们首先考虑 A->B 的含义。 A->B 表示 A 证书由 B 证书签名。更准确地说,A 证书是用 B 证书中的公钥签名的。
如果我们在B中使用E对公钥进行签名得到证书C,那么B和C的公钥相同,所以对于A来说,A->B和A->C->E都是A有效的证书链。
如果使用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 证书的支持。
总结
暂无评论内容