基本概念
-
ASN.1 (Abstract Syntax Notation dotone)抽象语法标记1,定义了一种规则用于描述数据类型
-
DER (Distinguished Encoding Rules) 定义一种编码规则用来保存ASN.1 DER和ASN.1
-
PEM (Privacy-Enhanced Mail) 将DER的base64编码后的内容并添加首尾行的ASCII文本
-
X.509 是ITU(International Telecommunication Union)定义了公钥证书体系的格式,规定了如何使用ASN.1来保存体系所用到的数据结构
之间的关系可以用下面的映射来描述
X.509 : Public Key->ASN.1
DER : ASN.1->Binary Data
PEM : Binary Data->String
示例
RSA公钥编码成PEM文件的流程如下
RSA公钥 -> X509规定公钥在ASN.1的描述 -> DER编码 -> PEM编码
可以使用Openssl获取PEM,并且解析DER对应的ASN.1的结构
openssl genrsa -out key.pem 2048 // 生成2048位RSA的私钥
openssl rsa -in key.pem -outform PEM -pubout -out public.pem // 通过私钥生成公钥并保存为PEM格式
openssl rsa -pubin -inform PEM -outform der -in public.pem -out public.der // PEM格式转为DER格式
openssl asn1parse -inform DER -in public.der // 解析获取ASN.1的数据结构
最后一步输出结果
0:d=0 hl=4 l= 290 cons: SEQUENCE
4:d=1 hl=2 l= 13 cons: SEQUENCE
6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
17:d=2 hl=2 l= 0 prim: NULL
19:d=1 hl=4 l= 271 prim: BIT STRING
X509规定公钥使用下面的ASN.1的结构描述
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
和上面通过Openssl解析DER文件获取到的ASN.1结构是一致的