秘钥格式
RSA秘钥存储一般有两种格式
- DER
- PEM
DER
DER:Distinguished Encoding Rules(可辨别编码规则),是ASN.1的一种。
ASN.1:Abstract Syntax Notation One(抽象语法标记),ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
证书信息一般以二进制的DER格式存储在文件中以供RSA,SSL使用。
PEM
DER一般是二进制文件形式存储,打印性较差,因此对DER内容进行base64编码,并补充说明key类型的头和尾就构成了PEM
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMYfnvWtC8Id5bPKae5yXSxQTt
+Zpul6AnnZWfI2TtIarvjHBFUtXRo96y7hoL4VWOPKGCsRqMFDkrbeUjRrx8iL91
4/srnyf6sh9c8Zk04xEOpK1ypvBz+Ks4uZObtjnnitf0NBGdjMKxveTq+VE7BWUI
yQjtQ8mbDOsiLLvh7wIDAQAB
-----END PUBLIC KEY-----
因此PEM,DER实质内容是相同的。
上面提到key以一定的结构存储的,不同的结构,补充的元信息也不同主要有两种组织形式PKCS#1,PKCS#8
PKCS#1
PKCS#1结构仅为RSA设计
- PEM形式
PublicKey
-----BEGIN RSA PUBLIC KEY-----
BASE64 ENCODED DATA
-----END RSA PUBLIC KEY-----
PrivateKey
-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
- DER的结构
PublicKey
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
PrivateKey
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
PKCS#8
X509,SSL支持的算法不仅仅是RSA,因此产生了更具有通用性的PKCS#8
- PEM
PublicKey
-----BEGIN PUBLIC KEY-----
BASE64 ENCODED DATA
-----END PUBLIC KEY-----
PrivateKey
-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
- DER
PublicKey
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
RSA公钥的OID 为 1.2.840.113549.1.1.1
PrivateKey
PrivateKeyInfo ::= SEQUENCE {
version Version,
algorithm AlgorithmIdentifier,
PrivateKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
RSA私钥的OID 为 1.2.840.113549.1.1.1
与PKCS#1相比将文件包含的加密算法和Key分开存储,因此可以存储其他加密算法的Key
使用openssl生成秘钥
生成2048位RSA秘钥,使用3des加密秘钥文件private.pem
openssl genrsa -des3 -out private.pem 2048
导出公钥,默认为PKCS#8结构
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
导出PKCS#1结构的公钥,注意openssl版本,老版本可能不支持
openssl rsa -in private.pem -outform DER -RSAPublicKey_out -out public_pcks1.cer
导出无加密保护的私钥
openssl rsa -in private.pem -out private_unencrypted.pem -outform PEM