1.1. RSA 密钥管理

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/book/pki-tutorials/1.1.manage-rsa-keys/

本章节介绍如何使用 OpenSSL 生成、转换、编码、加密、解密 RSA 密钥。

生成 RSA 私钥

生成 RSA 私钥一般使用 OpenSSL 的 genrsa 子命令。

比如,生成一个文件名为 rsa-p1-raw.pem RSA 私钥文件,配置如下:

Property Value
Bits 2048
Cipher AES-256-CFG
Standard PKCS#1
Encoding PEM
1openssl genrsa -aes-256-cfb -out ./rsa-p1.pem 2048

如果不传递任何对称加密算法标志(如 -aes-256-cfb),则会生成一个不带加密保护的裸私钥。

常用参数

-outform

指定输出的文件格式,可以取值 PEMDER 之一。

-rand

指定用于生成随机数的随机种子文件路径。

规范转换

PKCS#1 -> PKCS#8

1openssl pkcs8 \
2    -topk8 \
3    -inform PEM \
4    -outform PEM \
5    -in rsa-p1.pem \
6    -out rsa-p8.pem

默认使用 -v2 aes256 参数进行加密,如果转换之后的密钥不需要加密保护,则加上 -nocrypt,如:

1openssl pkcs8 \
2    -topk8 \
3    -inform PEM \
4    -outform PEM \
5    -nocrypt \
6    -in rsa-p1.pem \
7    -out rsa-p8-raw.pem

PKCS#8 -> PKCS#1

1openssl rsa \
2    -aes-256-cfb \
3    -in rsa-p8.pem \
4    -out rsa-p1.pem

如果转换之后的密钥不需要加密保护,则去掉如 -aes-256-cfb 的加密算法标志,如:

1openssl rsa \
2    -in rsa-p8.pem \
3    -out rsa-p1-raw.pem

默认输入和输出编码都是 PEM,如果输入的 DER 请指定 -inform DER,需要输出 DER 请指定 -outform DER

编码转换

PKCS#1: PEM <=> DER

e.g. PEM -> DER,反之亦然

1openssl rsa \
2    -inform     PEM \
3    -outform    DER \
4    -in         rsa-p1-raw.pem \
5    -out        rsa-p1-raw.der

PKCS#8: PEM <=> DER

OpenSSL 对 PKCS#8 的 DER 编码支持不完善,请勿使用。

加密/解密私钥

加密 PKCS#1 私钥

1openssl rsa \
2    -inform PEM \
3    -aes-256-cfb \
4    -in rsa-p1-raw.pem \
5    -out rsa-p1.pem

解密 PKCS#1 私钥

1openssl rsa \
2    -inform PEM \
3    -in rsa-p1.pem \
4    -out rsa-p1-raw.pem

加密 PKCS#8 私钥

1openssl pkcs8 \
2    -topk8 \
3    -inform PEM \
4    -v2 aes256 \
5    -in rsa-p8-raw.pem \
6    -out rsa-p8.pem

解密 PKCS#8 私钥

1openssl pkcs8 \
2    -inform PEM \
3    -in rsa-p8.pem \
4    -out rsa-p8-raw.pem

提取公钥

1openssl rsa \
2    -inform PEM \
3    -in rsa-p1-raw.pem \
4    -pubout \
5    -out rsa-p1.pub

其中 -in 可以传递 PKCS#1PKCS#8 的密钥。

查看公钥信息

1openssl rsa \
2    -inform PEM \
3    -pubin \
4    -text \
5    -noout \
6    -in rsa-p1.pub

查看私钥信息

1openssl rsa \
2    -inform PEM \
3    -noout \
4    -text \
5    -in rsa-p1.pem

测试密钥

1# 生成一个随机文件
2openssl rand -out tmp.dat 4096
3
4# 使用私钥对该随机文件进行 RSA-SHA-256 签名
5openssl dgst -sha256 -sign rsa-p1.pem -out tmp.dat.sig tmp.dat
6
7# 验证签名
8openssl dgst -sha256 -verify rsa-p1.pub -signature tmp.dat.sig tmp.dat

以上便是 RSA 密钥的生成、转换、编码、加密、解密、提取公钥、查看公钥信息、查看私钥信息、测试密钥的方法。

comments powered by Disqus

翻译: