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 | $ openssl dsaparam -genkey 2048 | openssl dsa -out dsa.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 | [req] |
再通过执行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 生成证书
生成证书时,可选用以下三种方式中的任一种:
- 通过 csr 文件生成
$ openssl x509 -req -days 365 -in ec.csr -signkey ec.key -out ec.crt
- 在生成证书时通过交互式填写 CSR 信息
$ openssl req -new -x509 -days 365 -key fd.key -out fd.crt
- 在生成命令中添加 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 | Certificate: |
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 | $ openssl x509 -inform PEM -in ec.pem -outform DER -out ec.der |
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 证书等。