oryx2
5 min readApr 7, 2016

秘钥格式

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

参考
asn1-key-structures-in-der-and-pem