前言
生成key很简单,一个命令就够了:
openssl genrsa -out fd.key 2048
提取public key
openssl rsa -in fd.key -pubout -out fd-public.key
key转换
openssl rsa -inform PEM -in fd.pem -outform DER -out fd.der
openssl rsa -inform DER -in fd.der -outform PEM -out fd.pem
以上,就这样简单。
如果你对上面的概念或者方法有疑问,例如PEM、DER是啥,key里面有啥,key能不能加密等等,那你继续往下看。
概念
在生成Key之前,你需要了解公钥、私钥的概念。
在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
- 公钥:公钥用来给数据加密,用公钥加密的数据只能使用私钥解密
- 私钥:如上,用来解密公钥加密的数据。
另外,还有两个缩写也要了解DER和PEM
- DER的缩写是Distinguished Encoding Rules,以二进制形式存储Key
- PEM的缩写是Privacy Enhanced Mail,以文本形式存储的Key,其实是DER Key的Base64形式
生成KEY
Key算法
OpenSSL支持RSA、DSA和ECDSA key,但不是所有的算法都可以适用所有场合。例如对于SSL Key,大家都用RSA,因为DSA Key实际上被限制为1024 bit,另外的ECDSA Key也还未被CA支持。
Key size
默认情况下的key长度可能不安全,这需要你在生成key的时候指定key长度,例如RSA 512 bit的key是不安全的。
Passphrase
OpenSSL有个对生成Key加密的选项,用它可以更有效地保护生成的key。但是,如果用了这个选项,需要每次在使用这个key的时候输入密码,这会带来一些不便。
生成RSA Key
openssl genrsa -out fd.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.............................+++++
......................+++++
e is 65537 (0x010001)
fd.key里面是啥内容呢?
cat fd.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqQEHRekC6Kew2NUBlce1BE4QucndOhxvqPnkJcMTDNacuMub
kDex9sZXUPZGyH8xQLZQ+zJf51LY0wpCPcNonsme22LGjOlckPjsqUiWtx+kfFYO
[...]
-----END RSA PRIVATE KEY-----
这是一串ASCII文本内容,方便人阅读的内容,这就是PEM格式的Private Key。
其实这个key内容并非一些随机数字,它是由某种结构组成的。
openssl rsa -text -in fd.key
RSA Private-Key: (2048 bit, 2 primes)
modulus:
00:a9:01:07:45:e9:02:e8:a7:b0:d8:d5:01:95:c7:
[...]
publicExponent: 65537 (0x10001)
privateExponent:
44:51:ab:1c:02:c6:ef:40:22:c8:74:cb:30:3e:4c:
[...]
prime1:
00:d0:3c:db:3e:07:da:3f:49:2a:cd:7c:30:42:2b:
[...]
prime2:
00:cf:c4:7a:33:80:8b:d9:22:3f:fc:78:f5:2c:cc:
[...]
exponent1:
2c:cc:5a:d2:3e:78:3a:53:30:4d:22:a1:73:2a:e8:
[...]
exponent2:
7c:c0:75:bb:ac:e8:cb:d4:e3:e4:bd:e0:41:29:23:
[...]
coefficient:
00:a7:ac:3d:19:c4:76:8a:e3:65:ba:b1:16:2b:92:
[...]
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqQEHRekC6Kew2NUBlce1BE4QucndOhxvqPnkJcMTDNacuMub
[...]
-----END RSA PRIVATE KEY-----
从Private Key生成Public Key
openssl rsa -in fd.key -pubout -out fd-public.key
writing RSA key
打开里面看看有什么
cat fd-public.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqQEHRekC6Kew2NUBlce1
BE4QucndOhxvqPnkJcMTDNacuMubkDex9sZXUPZGyH8xQLZQ+zJf51LY0wpCPcNo
[...]
-----END PUBLIC KEY-----
很明显这也是PEM格式的key,Public key比Private key短很多。
对Key加密
上面提到了Passphrase ,接下来看看是怎么用的。
openssl genrsa -aes128 -out fd.key 2048
上面的命令行,多加了一个选项-aes128 ,意思是将生成的key用aes128加密。那么接下来需要你输入加密的密码:
openssl genrsa -aes128 -out fds.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.....................................................+++++
...........................+++++
e is 65537 (0x010001)
Enter pass phrase for fds.key:
Verifying - Enter pass phrase for fds.key:
打开看看,它跟不加密的是不一样的:
cat fds.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,717B518BBF2C5D31783232C9D89D6512
FBlKXpxNxpuEBUAm/ZcBJpVy5AoPuBBPVeh6kIxX+J5H/T/zORfgSVGnNAz8wIQR
[...]
后续用到这个key,都要输入密码,例如key转换。
openssl rsa -in fds.key -pubout -out fds-public.key
Enter pass phrase for fd.key:
不过有种偷懒的方法,即把密码写在命令行参数上,即用到-passout 参数。
openssl genrsa -aes128 -passout pass:123456 -out fds.key 2048
生成公钥,需要用到passin 参数
openssl rsa -in fds.key -passin pass:123456 -pubout -out fds-public.key
私钥转非加密
openssl rsa -in fds.key -passin pass:123456 -out fd.key
私钥转加密
openssl rsa -in fd.key -aes128 -passout pass:123456 -out fds.key
Key和证书转换
Private key和证书(certificates)可以以多种格式存储,在实际使用中,你会将会遇到需要将某种格式的Key转换成另外一种。在转换前,先了解下几个格式的特点:
Binary (DER) certificate 原始格式中包含一个X.509 certificate,使用的是DER ASN.1编码。
ASCII (PEM) certificate(s) 包含 base64 编码的 DER 证书,通过 -----BEGIN CERTIFICATE----- 和-----END CERTIFICATE----- 将内容包括起来。 通常每个文件只有一个证书,但有些程序根据上下文允许多个证书。
Binary (DER) key 包含一个用DER ASN.1格式编码的Private Key,OpenSSL一般通过其传统的SSLeay格式创建Key,当然也有叫PKCS#8 (在RFC 5208里面有定义)的格式,但是不常用。
ASCII (PEM) key 包含带有附加元数据的 base64 编码的 DER 证书(例如,用于密码保护的算法)。
PKCS#7 certificate(s) 一种设计用于传输签名或加密数据的复杂格式,在 RFC 2315 中定义。
PKCS#12 (PFX) key and certificate(s) 一种复杂的格式,可以将受保护的服务器密钥与相应的证书以及中间证书一起存储。 它常见于 .p12 和 .pfx 扩展名。
PEM and DER Conversion
PEM 和 DER 格式之间的证书转换是使用 x509 工具执行的。
将证书从 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 用于 RSA 密钥,dsa 用于 DSA 密钥。
例如RSA Key转换:
openssl rsa -inform PEM -in fd.pem -outform DER -out fd.der
openssl rsa -inform DER -in fd.der -outform PEM -out fd.pem
PKCS#12 (PFX) Conversion
只需一条命令即可将 PEM 格式的密钥和证书转换为 PKCS#12:
openssl pkcs12 -export -out fd.p12 -inkey fd.key -in fd.crt -certfile fd-chain.crt
PKCS#7 Conversion
从 PEM 转换为 PKCS#7,使用 crl2pkcs7 命令:
openssl crl2pkcs7 -nocrl -out fd.p7b -certfile fd.crt -certfile fd-chain.crt
将 PKCS#7 转换为 PEM,使用带有 -print_certs 开关的 pkcs7 命令:
openssl pkcs7 -in fd.p7b -print_certs -out fd.pem
|