OpenSSL生成密钥key详解

Posted 嵌入式软件实战派

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL生成密钥key详解相关的知识,希望对你有一定的参考价值。

前言

生成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

以上是关于OpenSSL生成密钥key详解的主要内容,如果未能解决你的问题,请参考以下文章

求助,在android端使用openssl生成的rsapublicKey解密的相关问题

openssl生成密钥

Windows下RSA密钥生成工具openssl

Mac OpenSSL 生成支付宝 2048位密钥

openssl 怎样生成公钥和密钥 x509格式

使用openssl生成RSA公私密钥