OpenSSL 入门

1 简介

OpenSSL是一个实现了 SSL 与 TLS 协议的工具,是网络基础中的重要一环,其知名事件莫过于2014年的心脏出血漏洞,直接导致全球三分之二的活跃网站受影响。深入了解后就会发现,OpenSSL就像一把瑞士军刀,是一款非常强大健壮的加密工具集。令人难以置信的是,如此庞大的项目仅有 7 名成员,其中只有两名全职人员,其余都是志愿者,每年预算不到 100 万美元,却撑起了整个互联网的安全通信,只有在心脏出血漏洞时,OpenSSL才被大家所熟知,希望越来越多的厂商能够参与到开源项目中,为互联网添砖加瓦。

2 基础使用

查看版本 openssl version [-a]
openssl 就像瑞士军刀一样,支持许多功能,使用openssl help查看所有支持的命令
为了生成安全的密钥,目前建议生成 2048 位的 RSA 或 256 位的ECDSA。

3 密钥

3.1 生成密钥

3.1.1 对称密钥

1
$ openssl genrsa [加密算法名] -out [密钥保存路径] [密钥长度]

openssl genrsa -aes128 -out fd.key 2048

3.1.2 非对称密钥

非对称密钥的生成需要两步:

  1. 创建参数
  2. 创建密钥

可以通过以下方式通过一条命令生成

1
2
$ openssl dsaparam -genkey 2048 | openssl dsa -out dsa.key -aes128
$ openssl ecparam -genkey -name secp256r1 | openssl ec -out ec.key -aes128

OpenSSL支持许多命名曲线(可以使用openssl ecparam -list_curves获取完整列表),但对于Web服务器密钥,仅限于所有主要浏览器都支持的两条曲线:secp256r1(OpenSSL使用名称prime256v1)和secp384r1

3.2 读取密钥

1
$ openssl rsa -text -in fd.key

4 CSR

4.1 生成 CSR

4.1.1 通过终端交互式生成

1
$ openssl req -new -key fd.key -out fd.csr

4.1.2 通过配置文件生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[req]
prompt = no
distinguished_name = dn
default_bits = 4096
default_md = sha256

[dn]
C = CN
ST = Guangdong
L = Shenzhen
O = DJI Inc.
OU = IT Department
CN = example.com
emailAddress = [email protected]

再通过执行openssl req -new -config ec.cnf -key ec.key -out ec.csr生成

4.2 读取 CSR

1
$ openssl req -text -in fd.csr -noout

5 证书

5.1 生成证书

生成证书时,可选用以下三种方式中的任一种:

  1. 通过 csr 文件生成 $ openssl x509 -req -days 365 -in ec.csr -signkey ec.key -out ec.crt
  2. 在生成证书时通过交互式填写 CSR 信息$ openssl req -new -x509 -days 365 -key fd.key -out fd.crt
  3. 在生成命令中添加 CSR 信息:$ 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"

如果需要在证书中包含多个域名,可以新建一个ec.ext文件,内容如下:

1
subjectAltName = DNS:example.com,DNS:*.example.com

然后在生成证书时执行openssl x509 -req -days 365 -in ec.csr -signkey ec.key -out ec.crt -extfile ec.ext

有时我们在抓 HTTPS 包或者本地开发需要用到 https 时,就可以使用该方式来生成自签证书,正如之前 12306 报证书错误就是由于 12306 自己签发的证书无法被浏览器认证所导致。另外,目前叶正书的最长有效期认证为825天,超过此时间Chrome会提示 NET::ERR_CERT_VALIDITY_TOO_LONG。根据 Chrome 最新政策,于 2020-09-01 后申请的证书,有效期不得大于 398 天。

5.2 查看证书

5.2.1 查看全部信息

1
$ openssl x509 -text -in ec.crt -noout
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
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 16825656056182609007 (0xe980bd0975aa146f)
Signature Algorithm: ecdsa-with-SHA1
Issuer: C=CN, ST=Guangdong, L=Shenzhen, O=DJI Inc., OU=IT Department, CN=example.com/[email protected]
Validity
Not Before: Jun 28 08:41:01 2020 GMT
Not After : Jun 28 08:41:01 2021 GMT
Subject: C=CN, ST=Guangdong, L=Shenzhen, O=DJI Inc., OU=IT Department, CN=example.com/[email protected]
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:3e:f0:7d:ab:ee:e5:5f:75:19:fb:89:4f:ef:80:
00:79:5a:c8:07:8e:7f:c1:fb:ba:d0:77:76:ea:b3:
44:79:a3:b5:e1:51:d9:c6:20:18:97:07:41:00:30:
3d:26:26:aa:53:b2:f9:59:ea:2a:23:ed:cb:88:da:
0b:f0:08:96:c3
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:example.com, DNS:*.example.com
Signature Algorithm: ecdsa-with-SHA1
30:46:02:21:00:aa:bd:04:41:30:7e:f1:14:e4:ea:c6:ed:8d:
f3:b3:91:06:36:f4:b8:4f:0b:86:30:92:0f:26:5c:bb:c4:94:
51:02:21:00:b9:03:35:a2:2f:07:b5:d4:db:a9:23:ee:c2:c1:
86:36:50:ef:05:a1:18:b7:b6:0e:be:bf:1c:31:b9:55:32:13

5.2.2 查看有效期

1
$ openssl x509 -in ec.crt -noout -dates

查看起始和结束有效期的参数分别为-startdate-enddate

5.3 验证证书

子证书的Authority Key Identifier的 Key ID 必须与其上级颁发证书的Subject Key Identifier的 Key ID 一致

5.4 证书格式转换

1
2
$ openssl x509 -inform PEM -in ec.pem -outform DER -out ec.der
$ openssl x509 -inform DER -in ec.der -outform PEM -out ec.pem

6 性能测试

1
$ openssl speed rc4 aes rsa ecdh sha

多核 CPU的测试:

1
$ openssl speed -multi 4 rsa

激活硬件加速测试

1
$ openssl speed -evp aes-128-cbc

更多内容请查看 https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html ,其中有一些本文未提到的部分,如创建 root 证书等。

因为热爱,所以执着。