OpenSSL是一个开源项目,包括密码库和SSL/TLS工具集。 从项目的官方站点可以看到:
OpenSSL项目是安全套接字层( secure sockets layer, SSL)和传输层安全( transport layer security, TLS)协议的一个实现,是大家共同努力开发出的代码可靠、功能齐全、商业级别的开源工具集。项目由遍布世界的志愿者所组成的社区进行管理,他们通过互联网进行沟通、计划和开发OpenSSL工具集以及相关的文档。
OpenSSL在这一领域已经成为事实上的标准,并且拥有比较长的历史。现在几乎所有的服务器软件和很多客户端软件都在使用OpenSSL,其中基于命令行的工具是进行密钥、证书管理以及测试最常用到的软件了。
确定 OpenSSL 版本和配置
查看ubuntu版本
查看OpenSSL版本
上面最后一行的输出( /usr/lib/ssl)是OpenSSL默认情况下查找配置和证书的目录 。
misc/目录包含一些补充脚本,其中最有用的脚本允许你实现一个私有的证书颁发机构。
查看可用命令
第一部分标准命令Standard commands列出了所有可以使用的工具。如果对于某个命令,想获取更加详细的信息,可以使用man加上工具的名称。例如man ciphers会告诉我们密码套件是如何配置的。
第二部分消息摘要命令Message Digest commands展示了可用的消息摘要命令。
第三部分加密命令Cipher commands 展示了所有的加密命令 。
创建可信证书库
OpenSSL没有自带可信根证书(也叫作可信证书库),所以如果你是自己从头开始安装的话,那么就需要从别的地方找找了。一种选择是使用操作系统自带的可信证书库,一般来说没有问题,但是这个可信证书库可能不是最新的。更好的一种选择是从Mozilla那里获取,虽然麻烦一点 。
密钥和证书管理
多数用户借助OpenSSL是因为希望配置并运行能够支持SSL的Web服务器。整个过程包括3个步骤: (1) 生成强加密的私钥; (2) 创建证书签名申请( certificate signing request, CSR)并且发送给CA; (3) 在你的Web服务器上安装CA提供的证书。
生成密钥
现在,一般认为2048位的RSA密钥是安全的,所以你应该采用这个长度的密钥。 DSA密钥也应该不少于2048位, ECDSA密钥则应该是256位以上。
使用genrsa命令来生成RSA密钥
openssl genrsa -aes128 -out fd.key 2048
这里,我指定私钥会使用AES-128算法来加密保存。
私钥以所谓的PEM格式存储,该格式仅包含文本:
cat fd.key
乍一看私钥是一堆随机数据,其实不是。你可以使用下面的rsa命令解析出私钥的结构:
openssl rsa -text -in fd.key
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Private-Key: (2048 bit)
modulus:
00:b3:02:c2:68:7a:bd:b3:11:47:98:d9:25:e1:21:
d8:16:84:aa:e7:23:85:aa:f9:38:8f:e2:7f:d1:b5:
2f:76:c8:5a:d9:75:f9:6c:d2:54:dd:e0:b2:be:3c:
f6:eb:9b:0e:3d:b6:37:eb:02:d1:44:09:09:40:f8:
4d:5d:1d:41:1d:53:79:dc:b1:55:2e:e7:8b:0a:62:
b7:07:2e:55:ef:fc:92:96:6a:ef:3c:27:0a:74:17:
8e:57:b7:79:d5:83:5f:cc:53:a9:e6:b9:8a:fa:00:
23:b9:ec:78:e2:a3:69:81:ac:28:3e:06:cb:92:05:
db:35:7b:00:b3:fc:52:da:2a:17:1c:14:67:67:ad:
1f:d4:e2:80:51:9f:40:4c:b8:a7:3e:9a:8b:2e:f8:
5c:a7:dd:73:55:84:c7:4d:9b:eb:24:0a:c7:b6:b0:
57:fc:96:a2:9a:81:14:18:dc:20:db:8b:d1:31:e1:
5d:01:78:23:cb:20:1d:c2:a4:fc:bd:da:b2:16:fc:
63:22:b9:31:d1:50:21:78:07:b6:91:9e:47:10:de:
80:3d:d4:8e:bb:cb:d0:ca:ba:8e:7b:6d:ba:3c:b5:
9a:af:49:96:8a:6f:72:bc:cc:a8:73:07:1f:8e:d3:
77:99:98:72:9e:35:eb:01:70:ee:f5:75:33:e9:ff:
e3:e5
publicExponent: 65537 (0x10001)
privateExponent:
7b:17:b5:a8:f4:65:c7:61:65:73:34:36:78:e5:b5:
da:5e:25:ca:c4:c1:60:7c:f9:28:ef:9d:e7:0d:08:
f3:4b:f8:34:ba:8b:e6:09:87:b3:fe:93:ca:7e:cf:
67:d9:7a:64:73:0d:66:7b:cc:7c:55:1e:58:df:a5:
0b:17:57:b4:1b:b7:9b:4b:11:81:2c:54:8e:b2:ac:
9a:b2:81:03:82:11:26:7f:a7:bc:1c:38:72:f5:d3:
ba:7b:7e:ba:94:18:e6:be:cd:00:cb:ab:46:17:9c:
79:77:a2:f4:6d:5b:da:80:10:37:fe:a2:32:e9:f5:
ff:83:72:4b:51:81:83:63:f1:89:7b:7e:80:35:5e:
55:92:8e:11:8c:bb:d8:36:b8:34:02:6d:ed:14:e0:
09:1a:d2:ea:90:d3:b8:04:cc:c3:48:1d:10:30:39:
da:e2:ab:a9:f5:a8:83:3b:54:6e:1f:8e:2d:6a:7e:
5b:2c:ef:0f:6b:b2:d9:33:d1:68:f7:b7:7b:ca:8f:
bf:33:f6:77:0d:88:f9:18:db:cc:be:16:93:d0:92:
be:8a:22:8c:aa:da:fa:80:59:eb:69:85:d3:ff:de:
c1:58:fd:5b:92:37:21:56:eb:56:ad:c4:d0:dd:96:
cd:55:e6:97:ed:e4:15:fb:10:de:a3:8e:75:0e:c7:
2d
prime1:
00:d9:48:10:0b:85:a5:bb:98:ef:03:89:05:37:74:
9a:97:2b:00:cf:6e:3a:bd:a2:8e:b0:a4:e9:de:32:
72:14:a8:50:4d:de:b7:d1:fa:bc:3c:43:97:c6:fe:
d2:24:a2:da:56:ff:40:be:75:bf:ee:63:bf:04:50:
dc:d3:8d:ea:31:77:11:f8:b1:48:55:39:c5:f1:92:
46:df:34:68:47:8f:70:3d:72:5c:b8:a7:3d:31:14:
44:38:f5:ff:2d:38:78:08:34:d0:2b:80:8b:63:fb:
bc:40:e1:29:91:37:99:f4:0b:36:5a:e5:42:19:81:
ec:e0:22:30:8c:8e:38:7c:3f
prime2:
00:d2:e8:dd:6d:e5:e7:62:2c:24:74:fb:c1:e3:52:
d6:f7:78:29:7d:39:03:65:76:d3:57:84:10:78:7f:
b1:08:9d:68:ee:f7:5c:50:d7:51:a0:e5:e8:ca:fc:
7d:2e:18:64:9a:c8:46:89:4d:49:86:5b:73:83:bf:
66:21:ac:45:98:b5:37:ce:6e:1f:ff:c1:5a:f5:2f:
1b:e1:67:75:a3:0f:06:cd:17:24:24:69:90:f5:ed:
2b:c8:b8:9c:be:ab:1f:a8:ba:79:6c:eb:e3:4d:c5:
c3:00:5c:17:6c:1d:de:c4:50:ff:d8:7c:6e:ef:8b:
41:c8:40:08:a7:60:b3:e6:db
exponent1:
00:8c:b1:40:d2:75:23:af:a9:83:7a:c2:8a:82:32:
1a:b7:af:bc:c2:94:19:ad:19:49:53:d0:35:2f:0f:
73:17:35:35:6a:76:c0:88:52:d6:f8:1e:bc:74:ba:
23:d0:5d:33:0c:0a:14:1e:3f:98:9c:00:32:7b:d4:
f0:68:7c:08:1d:27:80:97:8c:13:ce:3b:ae:94:91:
a7:1a:78:90:dd:65:5f:c4:29:fd:28:04:02:77:79:
2c:03:c6:26:09:5d:fb:3b:35:17:66:53:c1:ee:67:
de:aa:14:22:1a:49:ea:82:3f:90:5e:a2:fc:7e:0f:
c7:16:0a:8d:6d:35:da:15:79
exponent2:
00:87:07:3b:2c:ae:f2:32:72:1c:6d:20:f9:82:f6:
78:56:3b:82:24:7f:a9:e2:fd:ee:54:ab:62:78:23:
18:4e:71:a8:ca:c5:67:3f:02:7b:6a:4d:87:7a:dd:
a7:af:29:42:cf:ad:c5:2b:06:66:3a:34:b6:81:f4:
ba:08:78:e8:9d:d9:f7:7e:9c:16:b4:81:30:20:a5:
26:6e:6a:f4:6f:8e:a1:46:10:b8:bc:ef:31:35:a1:
c0:54:63:8d:46:ac:fc:39:e4:18:f5:59:18:4f:a4:
7b:31:f1:c3:b5:1e:72:8e:b1:64:fb:4e:bf:1f:71:
c2:8d:d8:21:32:37:c1:35:dd
coefficient:
00:9a:f0:08:62:0b:0d:0c:d0:ff:23:f1:06:8d:e4:
8f:db:7d:16:f5:33:d5:6c:d1:dc:1e:d1:35:33:a1:
4f:7b:e4:ef:ed:eb:ac:a1:36:a1:87:44:f3:e1:d2:
24:3b:45:c0:d3:47:92:63:ec:ec:06:aa:a4:da:9c:
f4:0b:97:70:26:d1:c1:33:d8:40:ca:b7:46:95:e3:
a3:f6:ed:be:76:bf:1d:ee:71:a8:0f:9e:73:9a:e3:
5c:a1:d4:c3:03:77:29:ea:47:64:a4:e0:ac:4d:c4:
25:ea:cf:4a:15:58:fa:bb:b0:bd:7d:0c:cd:0f:23:
fc:9b:a8:72:fb:29:40:72:a7
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAswLCaHq9sxFHmNkl4SHYFoSq5yOFqvk4j+J/0bUvdsha2XX5
bNJU3eCyvjz265sOPbY36wLRRAkJQPhNXR1BHVN53LFVLueLCmK3By5V7/ySlmrv
PCcKdBeOV7d51YNfzFOp5rmK+gAjuex44qNpgawoPgbLkgXbNXsAs/xS2ioXHBRn
Z60f1OKAUZ9ATLinPpqLLvhcp91zVYTHTZvrJArHtrBX/JaimoEUGNwg24vRMeFd
AXgjyyAdwqT8vdqyFvxjIrkx0VAheAe2kZ5HEN6APdSOu8vQyrqOe226PLWar0mW
im9yvMyocwcfjtN3mZhynjXrAXDu9XUz6f/j5QIDAQABAoIBAHsXtaj0ZcdhZXM0
NnjltdpeJcrEwWB8+SjvnecNCPNL+DS6i+YJh7P+k8p+z2fZemRzDWZ7zHxVHljf
pQsXV7Qbt5tLEYEsVI6yrJqygQOCESZ/p7wcOHL107p7frqUGOa+zQDLq0YXnHl3
ovRtW9qAEDf+ojLp9f+DcktRgYNj8Yl7foA1XlWSjhGMu9g2uDQCbe0U4Aka0uqQ
07gEzMNIHRAwOdriq6n1qIM7VG4fji1qflss7w9rstkz0Wj3t3vKj78z9ncNiPkY
28y+FpPQkr6KIoyq2vqAWetphdP/3sFY/VuSNyFW61atxNDdls1V5pft5BX7EN6j
jnUOxy0CgYEA2UgQC4Wlu5jvA4kFN3SalysAz246vaKOsKTp3jJyFKhQTd630fq8
PEOXxv7SJKLaVv9AvnW/7mO/BFDc043qMXcR+LFIVTnF8ZJG3zRoR49wPXJcuKc9
MRREOPX/LTh4CDTQK4CLY/u8QOEpkTeZ9As2WuVCGYHs4CIwjI44fD8CgYEA0ujd
beXnYiwkdPvB41LW93gpfTkDZXbTV4QQeH+xCJ1o7vdcUNdRoOXoyvx9LhhkmshG
iU1Jhltzg79mIaxFmLU3zm4f/8Fa9S8b4Wd1ow8GzRckJGmQ9e0ryLicvqsfqLp5
bOvjTcXDAFwXbB3exFD/2Hxu74tByEAIp2Cz5tsCgYEAjLFA0nUjr6mDesKKgjIa
t6+8wpQZrRlJU9A1Lw9zFzU1anbAiFLW+B68dLoj0F0zDAoUHj+YnAAye9TwaHwI
HSeAl4wTzjuulJGnGniQ3WVfxCn9KAQCd3ksA8YmCV37OzUXZlPB7mfeqhQiGknq
gj+QXqL8fg/HFgqNbTXaFXkCgYEAhwc7LK7yMnIcbSD5gvZ4VjuCJH+p4v3uVKti
eCMYTnGoysVnPwJ7ak2Het2nrylCz63FKwZmOjS2gfS6CHjondn3fpwWtIEwIKUm
bmr0b46hRhC4vO8xNaHAVGONRqz8OeQY9VkYT6R7MfHDtR5yjrFk+06/H3HCjdgh
MjfBNd0CgYEAmvAIYgsNDND/I/EGjeSP230W9TPVbNHcHtE1M6FPe+Tv7eusoTah
h0Tz4dIkO0XA00eSY+zsBqqk2pz0C5dwJtHBM9hAyrdGleOj9u2+dr8d7nGoD55z
muNcodTDA3cp6kdkpOCsTcQl6s9KFVj6u7C9fQzNDyP8m6hy+ylAcqc=
-----END RSA PRIVATE KEY-----
如果你需要单独查看密钥的公开部分,可以使用下面的rsa命令:
openssl rsa -in fd.key -pubout -out fd-public.key
查看这个刚生成的文件,就会发现有明显的标识,表示这部分确实是公开的信息(公钥):
创建证书签名申请
一旦有了私钥,就可以创建证书签名申请( certificate signing request, CSR)。这是要求CA给证书签名的一种正式申请,该申请包含申请证书的实体的公钥以及该实体的某些信息。该数据将成为证书的一部分。 CSR始终使用它携带的公钥所对应的 私钥 对证书 进行签名。
CSR创建的过程一般都是交互式的,你需要提供区分证书所需的不同元素。如果你想让某一个字段为空,不要直接回车,必须输入一个点( .);如果直接回车,OpenSSL会直接使用这个字段默认的值。
root@ubuntu:/usr# openssl req -new -key fd.key -out fd.csr
Enter pass phrase for fd.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) [AU]:CN
State or Province Name (full name) [Some-State]:JP^H^H^[[3~^H^[[D^[[D^[[C^[[A^[[B^C
root@ubuntu:/usr# openssl req -new -key fd.key -out fd.csr
Enter pass phrase for fd.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) [AU]:cn
State or Province Name (full name) [Some-State]:JPprovince
Locality Name (eg, city) []:JiNan
Organization Name (eg, company) [Internet Widgits Pty Ltd]:jpconpany
Organizational Unit Name (eg, section) []:jpsection
Common Name (e.g. server FQDN or YOUR name) []:jpserver.test.com
Email Address []:xdyixia@163.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.
根据RFC 2985的5.4.1节①, 质询密码( challenge password)是一个可选字段,用于在证书吊销过程中确认申请过该证书的最初实体的身份。如果输入这个字段,则会将密码包括在CSR文件中并发送给CA。几乎没有CA会依赖这个字段,我所看到的帮助信
CSR生成之后,可以使用它去直接进行证书签名或者将它发送给公共CA让他们对证书进行签名。下面会具体讲这两种方式,但是在操作之前,最好再检查一遍CSR是正确的。可以这么做:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
root@ubuntu:/usr# openssl req -text -in fd.csr -noout
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=cn, ST=JPprovince, L=JiNan, O=jpconpany, OU=jpsection, CN=jpserver.test.com/emailAddress=xdyixia@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b3:02:c2:68:7a:bd:b3:11:47:98:d9:25:e1:21:
d8:16:84:aa:e7:23:85:aa:f9:38:8f:e2:7f:d1:b5:
2f:76:c8:5a:d9:75:f9:6c:d2:54:dd:e0:b2:be:3c:
f6:eb:9b:0e:3d:b6:37:eb:02:d1:44:09:09:40:f8:
4d:5d:1d:41:1d:53:79:dc:b1:55:2e:e7:8b:0a:62:
b7:07:2e:55:ef:fc:92:96:6a:ef:3c:27:0a:74:17:
8e:57:b7:79:d5:83:5f:cc:53:a9:e6:b9:8a:fa:00:
23:b9:ec:78:e2:a3:69:81:ac:28:3e:06:cb:92:05:
db:35:7b:00:b3:fc:52:da:2a:17:1c:14:67:67:ad:
1f:d4:e2:80:51:9f:40:4c:b8:a7:3e:9a:8b:2e:f8:
5c:a7:dd:73:55:84:c7:4d:9b:eb:24:0a:c7:b6:b0:
57:fc:96:a2:9a:81:14:18:dc:20:db:8b:d1:31:e1:
5d:01:78:23:cb:20:1d:c2:a4:fc:bd:da:b2:16:fc:
63:22:b9:31:d1:50:21:78:07:b6:91:9e:47:10:de:
80:3d:d4:8e:bb:cb:d0:ca:ba:8e:7b:6d:ba:3c:b5:
9a:af:49:96:8a:6f:72:bc:cc:a8:73:07:1f:8e:d3:
77:99:98:72:9e:35:eb:01:70:ee:f5:75:33:e9:ff:
e3:e5
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
a9:af:22:f5:5e:d8:18:bb:e0:ea:e3:08:70:a7:a9:5b:02:42:
f7:9f:99:d4:1b:41:54:58:9b:63:a7:20:9e:28:04:dd:b2:d5:
1f:5e:83:3b:ef:b8:d9:37:98:37:da:09:a9:2e:4f:3c:fd:c1:
a6:c2:ea:b7:97:ce:0f:fb:48:d4:0c:89:3b:fe:d2:ee:ae:ee:
b3:18:bc:f5:36:79:ea:08:de:37:41:a4:6b:44:9d:32:98:7b:
a0:b4:eb:9e:40:bc:43:ce:43:62:4e:a6:6c:98:f8:47:13:1d:
eb:e0:d5:9d:55:05:cc:01:9a:ee:5d:86:b1:ba:c8:cd:0d:62:
1c:a5:6c:60:ec:ed:89:96:50:57:ac:45:7c:b2:a3:fe:7d:10:
a9:da:67:1c:03:99:ff:be:f3:60:b7:b6:db:6c:50:82:01:3c:
6b:4c:cb:dc:c6:51:f2:ff:0d:86:86:8f:67:cb:66:be:d0:d4:
44:59:9a:e8:dc:9a:c7:53:0c:50:5a:f5:98:58:1d:61:90:59:
ab:de:27:e3:ff:2f:98:29:7f:ab:5f:17:a4:a1:ab:36:82:93:
ba:7a:f8:ea:92:91:4a:85:de:4b:16:56:a7:15:f3:e4:eb:ff:
a8:94:11:68:d8:b5:fb:a0:e1:d4:1c:09:0a:4f:e9:23:3d:80:
4b:79:48:35
用当前证书生成 CSR 文件
如果你想更新一张证书并且不想对里面的信息作任何更改,那么实现可以变得简单一些。使用下面的命令可以用当前的证书创建一个全新的CSR文件:
openssl x509 -x509toreq -in fd.crt -out fd.csr -signkey fd.key
非交互方式生成 CSR
可以先创建一个fd.cnf文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = PASSPHRASE
[dn]
CN = www.feistyduck.com
emailAddress = webmaster@feistyduck.com
O = Feisty Duck Ltd
L = London
C = GB
[ext]
subjectAltName = DNS:www.feistyduck.com,DNS:feistyduck.com
然后使用下面的命令直接创建CSR文件:
openssl req -new -config fd.cnf -key fd.key -out fd.csr
自签名证书
如果你只是想安装一台自己使用的TLS服务器,那么可以不必找CA去获取一个公开信任的证书,自己就可以直接签发一个。最简单的方式就是生成自签名证书。如果你使用Firefox,那么可以在第一次访问网站的时候创建一个证书例外,然后就可以像使用公开可信证书一样正常访问了。
如果已经有了CSR,可以使用下面的文件创建证书:
openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt
也可以无需单独创建一个CSR,使用下面的命令直接使用私钥创建自签名证书:
openssl req -new -x509 -days 365 -key fd.key -out fd.crt
如果你不想有交互提示,直接使用-subj并带上标题信息就可以了
openssl req -new -x509 -days 365 -key fd.key -out fd.crt
-subj "/C=GB/L=London/O=Feisty Duck Ltd/CN=www.feistyduck.com"
创建对多个主机名有效的证书
默认情况下, OpenSSL创建的证书只包含一个公用名而且只能设置一个主机名。因为这个限制,即便你有其他相关联的站点,也不得不为每个站点生成一张单独的证书。在这种情况下,使用一张多域名( multidomain)的证书就有意义了。即便你是维护一个站点,也得确保用户在访问站点的所有子域名的时候证书是有效的。在实际使用中意味着使用至少两个名称,一个是使用www开头的,一个是没有任何前缀的(例如www.feistyduck.com和feistyduck.com)。
有两种方式在一张证书里面支持多主机名。一种方式是在X.509的使用者可选名称( subjectalternative name, SAN)扩展字段里面列出所有要使用的主机名;另外一种就是使用泛域名。可以将两种方式合在一起,这样更加方便。在实际使用的时候,可以设置顶级域名和一个泛域名来囊括所有二级域名(例如feistyduck.com和*.feistyduck.com)。
当证书包括可选名称的时候,所有公用名就会被忽略。 CA新创建的证书甚至可能不再包括任何公用名,所以,请在可选名称列表中包含所有想要的主机名。
首先,将扩展信息放在一个单独的文本文件中,我将该文件命名为fd.ext。在这个文件中,指定扩展的名称( subjectAltName),并且像下面这样列出需要的主机名:
subjectAltName = DNS:*.feistyduck.com, DNS:feistyduck.com然后当使用x509命令签发证书的时候,使用-extfile开关引用该文件:
然后当使用x509命令签发证书的时候,使用-extfile开关引用该文件:
$ openssl x509 -req -days 365
-in fd.csr -signkey fd.key -out fd.crt
-extfile fd.ext
剩下的步骤与之前的一样,当然在检查证书的时候你会发现它包括了SAN扩展信息:
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:*.feistyduck.com, DNS:feistyduck.com
检查证书
第一眼看到证书内容的时候会觉得它们就是一堆随机数据,而你只需要知道如何解析它们,就会发现其实里面包含了很多信息。 x509命令可以帮助你查看刚生成的自签名证书。下面的例子中我使用-text来打印证书内容,使用-noout则不打印编码后的证书内容,这样可以减少信息干扰(默认情况下会打印):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
root@ubuntu:/usr# openssl x509 -text -in fd.crt -noout
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 11154907835031696390 (0x9ace319321493406)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=cn, ST=JPprovince, L=JiNan, O=jpconpany, OU=jpsection, CN=jpserver.test.com/emailAddress=xdyixia@163.com
Validity
Not Before: Oct 15 08:37:40 2019 GMT
Not After : Oct 14 08:37:40 2020 GMT
Subject: C=cn, ST=JPprovince, L=JiNan, O=jpconpany, OU=jpsection, CN=jpserver.test.com/emailAddress=xdyixia@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b3:02:c2:68:7a:bd:b3:11:47:98:d9:25:e1:21:
d8:16:84:aa:e7:23:85:aa:f9:38:8f:e2:7f:d1:b5:
2f:76:c8:5a:d9:75:f9:6c:d2:54:dd:e0:b2:be:3c:
f6:eb:9b:0e:3d:b6:37:eb:02:d1:44:09:09:40:f8:
4d:5d:1d:41:1d:53:79:dc:b1:55:2e:e7:8b:0a:62:
b7:07:2e:55:ef:fc:92:96:6a:ef:3c:27:0a:74:17:
8e:57:b7:79:d5:83:5f:cc:53:a9:e6:b9:8a:fa:00:
23:b9:ec:78:e2:a3:69:81:ac:28:3e:06:cb:92:05:
db:35:7b:00:b3:fc:52:da:2a:17:1c:14:67:67:ad:
1f:d4:e2:80:51:9f:40:4c:b8:a7:3e:9a:8b:2e:f8:
5c:a7:dd:73:55:84:c7:4d:9b:eb:24:0a:c7:b6:b0:
57:fc:96:a2:9a:81:14:18:dc:20:db:8b:d1:31:e1:
5d:01:78:23:cb:20:1d:c2:a4:fc:bd:da:b2:16:fc:
63:22:b9:31:d1:50:21:78:07:b6:91:9e:47:10:de:
80:3d:d4:8e:bb:cb:d0:ca:ba:8e:7b:6d:ba:3c:b5:
9a:af:49:96:8a:6f:72:bc:cc:a8:73:07:1f:8e:d3:
77:99:98:72:9e:35:eb:01:70:ee:f5:75:33:e9:ff:
e3:e5
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
3a:b5:8b:23:1a:2a:bf:a3:0c:27:04:18:54:d7:6f:cc:78:4a:
55:55:c5:4f:70:6d:79:6b:3e:72:d4:54:0f:18:9f:e5:33:34:
8a:ca:d8:cd:15:0d:ba:48:b8:0d:04:ca:30:e5:5d:58:52:14:
f8:e4:9e:8b:cd:19:c8:e2:b2:1c:67:d9:43:8a:d2:1e:7b:9a:
0a:29:d5:c2:9f:2e:78:c0:df:62:26:a9:cd:0a:92:c4:b7:12:
70:a6:21:e7:15:98:d3:5a:f4:be:47:eb:ec:78:b8:6c:39:68:
49:49:2b:dc:a9:ae:f9:de:88:91:e6:32:b8:a8:07:82:50:56:
2e:db:25:d6:6b:5f:ee:39:9b:d0:2f:7f:c6:5c:f8:4c:92:7e:
b1:3a:11:0c:1e:bf:6c:ba:af:19:23:85:8e:bf:e1:2b:9e:ff:
7e:75:e0:24:ec:91:72:0d:1e:f7:6f:55:e6:66:b1:ef:2a:2b:
e5:dc:91:ab:45:aa:ad:bf:48:a2:d7:5e:41:d0:a7:bf:a6:70:
88:07:bb:5d:7e:0a:13:44:58:f5:73:41:a2:2d:ee:5c:80:48:
a7:1c:44:7a:75:47:48:25:86:53:7d:f4:c0:8c:7c:f2:6d:af:
1c:d9:13:d2:d1:e4:ef:04:0c:9b:b5:37:58:47:6f:a0:7d:c2:
1e:4f:81:c9
就像上面的例子一样,自签名证书一般只包括最基本的证书数据。相比而言,公共CA签发的证书则含有更多有意义的信息(通过X.509扩展机制),让我们快速了解一下。
基本约束( basic constraint)扩展用于标记证书是否是一个CA,这样的证书可以给其他证书进行签名。非CA证书则没有这个扩展项或者其中CA的值会被设置为FALSE。这是一个关键扩展,意味着所有软件必须识别这个字段。
X509v3 Basic Constraints: critical
CA:FALSE
密钥用法( key usage, KU)和扩展密钥用法( extended key usage, EKU)扩展限制了证书的使用范围。如果这两个扩展存在,只有列表里面的使用方式是允许的。如果这个扩展不存在,则没有任何限制。你看到的这个例子是非常典型的Web服务器证书,也就是说它不能进行代码签名:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
CRL分发点( CRL distribution point)扩展列出了CA证书吊销列表( certificate revocation list,CRL)的地址,当证书需要被吊销的时候这个信息非常重要。 CA会对CRL进行签名,并且每隔一段时间发布一次(例如, 7天)。
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.starfieldtech.com/sfs3-20.crl
证书策略( certificate policy)扩展用来指出证书使用哪种策略签发,
例如扩展验证( extendedvalidation, EV)标识就在这里(证书下面这个例子)。每个标识都拥有一个唯一的对象标识符( object identifier, OID),对签发的CA来说它们是唯一的。另外这个扩展一般还包括一个或者多个证书策略声明( certificate policy statement, CPS),一般都是网页或者PDF文档。
509v3 Certificate Policies:
Policy: 2.16.840.1.114414.1.7.23.3
CPS: http://certificates.starfieldtech.com/repository/
颁发机构信息访问( authority information access, AIA)扩展包括了两个重要信息。首先它列出了CA的在线证书状态协议( online certificate status protocol, OCSP)响应程序的地址,可以用来实时监测证书的吊销情况。这个扩展可能还带上这个证书颁发者的证书地址(也就是证书链的上一层证书)。现在服务器证书已经很少直接使用根证书进行签名了,所以说用户一般需要在他们的配置里面加上一个或者多个中间证书,这时候就很容易出现因为漏了导致证书验证失败。有一些客户端(例如IE)会使用这个信息来获取中间CA的证书,从而弥补服务器忘记配置中间证书的问题,但是大部分的客户端不会.
Authority Information Access:
OCSP - URI:http://ocsp.starfieldtech.com/
CA Issuers - URI:http://certificates.starfieldtech.com/repository/sf_intermediate.crt
使用者密钥标识符( subject key identifier)和颁发机构密钥标识符( authority key identifier) 扩展分别建立了唯一的使用者和颁发机构标识符。证书的颁发机构密钥标识符扩展的信息必须与 颁发者的使用者密钥标识符扩展里面的信息一致。这些信息在证书链路径建立过程中相当有用 ,客户端会试图从分支(服务器)证书开始,寻找到根证书所有可能的路径。证书机构经常一个私 钥对应多个证书,而这个字段允许软件可以非常可靠地让证书和密钥对应起来。现实中很多服务器提供的证书链其实都是错误的,但是因为浏览器可以自动寻找到其他可信的路径,所以这种情况常常被忽略了。
X509v3 Subject Key Identifier:
4A:AB:1C:C3:D3:4E:F7:5B:2B:59:71:AA:20:63:D6:C9:40:FB:14:F1
X509v3 Authority Key Identifier:
keyid:49:4B:52:27:D1:1B:BC:F2:A1:21:6A:62:7B:51:42:7A:8A:D7:D5:56
最后使用者可选名称( subject alternative name)扩展用来列出所有合法的主机名。这个扩展是可选的,如果不存在,客户端就会使用使用者( subject)字段里面公用名( common name, CN)提供的信息;如果扩展存在,那么在验证过程中CN字段的内容会被忽略。
X509v3 Subject Alternative Name:
DNS:www.feistyduck.com, DNS:feistyduck.com
密钥和证书格式转换
私钥和证书可以以各种格式进行存储,所以你可能经常需要进行各种格式之间的转换,最常见的格式如下所示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Binary (DER) certificate
包含原始格式的X.509证书,使用DER ASN.1编码。
ASCII (PEM) certificate(s)
包含base64编码过的DER证书,它们以-----BEGIN CERTIFICATE-----开头,以-----ENDCERTIFICATE-----结尾。虽然有些程序可以允许多个证书存在一个文件中,但是一般来说一个文件只有一张证书。例如Apache Web服务器要求服务器的证书全部在一个文件里面,而中间证书一起放在另外一个文件中。
Binary (DER) key
包含DER ASN.1编码后的私钥的原始格式。 OpenSSL使用他自己传统的方式创建密钥( SSLeay)格式。还有另外一种不常使用的格式叫作PKCS#8(RFC 5208定义的)。 OpenSSL可以使用pkcs8命令进行PKCS#8格式的转换。
ASCII (PEM) key
包括base64编码后的DER密钥和一些元数据信息(例如密码的保存算法)
PKCS#7 certificate(s)
RFC 2315定义的一种比较复杂的格式,设计的目的是用于签名和加密数据的传输。一般常见的是.p7b和.p7c扩展名的文件,并且文件里面可以包括所需的整个证书链。 Java的密钥管理工具支持这种格式。
PKCS#12 (PFX) key and certificate(s)
一种可以用来保存服务器私钥和整个证书链的复杂格式,一般以.p12和.pfx扩展名结尾。这类格式常见于Microsoft的产品,但是也用于客户端证书。虽然很久以前PFX表示PKCS#12之前的版本,现在PFX常被用作PKCS#12的代名词,不过你已经很难遇到老版本了。
1. PEM和DER转换
使用x509工具进行PEM和DER格式之间的证书转换,从PEM转换到DER:
$ openssl x509 -inform PEM -in fd.pem -outform DER -out fd.der
从DER转换到PEM:
$ openssl x509 -inform DER -in fd.der -outform PEM -out fd.pem
在私钥的DER和PEM格式之间进行转换方式是一样的,但是需要使用rsa或者dsa命令分别用作RSA和DSA密钥。
2. PKCS#12( PFX)转换
只需要一个命令就可以将PEM转换成PKCS#12。下面的例子将密钥(fd.key)、 证书( fd.crt)以及中间证书( fd-chain.crt)转换成一个PKCS#12文件:
$ openssl pkcs12 -export
-name "My Certificate"
-out fd.p12
-inkey fd.key
-in fd.crt
-certfile fd-chain.crt
Enter Export Password: ****************
Verifying - Enter Export Password: ****************
3. PKCS#7转换
使用crl2pkcs7命令将PEM转换成PKCS#7格式:
$ openssl crl2pkcs7 -nocrl -out fd.p7b -certfile fd.crt -certfile fd-chain.crt
将pkcs7命令与-print_certs开关一起使用可以将PKCS#7转换成PEM格式:
openssl pkcs7 -in fd.p7b -print_certs -out fd.pem
与PKCS#12一样,你还得手动编辑fd.pem文件并且将其分成不同部分。
内容摘自《OpenSSL攻略》
根据该书进行的实验并截图