DER(Distinguished Encoding Rules)编码是ASN.1数据结构在ASN.1 DER标准下打包的二进制编码的格式规范。它是应用广泛的ASN.1编码之一。ASN.1是应用领域很广泛的一种数据表示和编码方式。ASN.1是Abstract Syntax Notation One(抽象语法标记语言第一版)的缩写。ASN.1是DSL领域的经典代表,业内有“数据的XML”之美誉。ASN.1可以只用于规范数据结构,而DER编码则是规范实际存储和传输数据的方式。
ASN.1规范的编码方式非常灵活,几乎可以描述任何数据类型。DER编码则是ASN.1进行编码时的一种约束,它规定了ASN.1数据结构如何序列化为二进制数据,使得数据能够在不同的计算机及不同语言之间互通。
数字证书是一个数字形式的身份证明文件,用于验证文件的真实性和所有权。数字证书的扩展名包括.crt、.cer、.p7c等。而DER编码的数字证书的扩展名通常是 .cer
与 DER 编码有关的数字证书解码器能够自动识别DER编码格式,为了使证书能够转换为其它类型,使用DER编码是一个不错的选择。
数码证书通常存储在X.509证书中。X.509证书使用 ASN.1 DER 编码格式,可以通过各种语言和工具进行解析和生成。在编码证书之前,我们通常使用私钥生成一对密钥,其中一个作为公共密钥被添加到证书中。
- // 生成证书
- openssl req -new -x509 -out my_cert.crt -keyout my_key.key -days 365
-
- // 查看证书内容
- openssl x509 -text -noout -in my_cert.crt
DER编码格式的编码规则简洁明了,它是基于ASN.1编码规范的。ASN.1定义了表示结构数据,编码,解码和传输的标准类型和格式。由于DER是固定格式,因此在传输或存储数据时不必存储ASN.1结构信息,这将节省传输空间。
无论什么类型它的DER编码都是有四部分组成:
字段 | 说明 |
---|---|
tag | 类型字段 |
length | 长度字段 |
value | 值字段 |
end | 结束表示字段 |
即T L V 三元组。
由一个字节(即八个二进制位)组成。
bit8 bit7用来表示tag类型,universal是00 application是01 context-specific是10 private是11
bit6表示结构化位,0代表简单类型,1代表结构类型
bit5-bit1表示tag值,tag值可以查表获得。
长度字段分为两种:小于等于127和大于127
小于等于127:用一个字节表示。bit8=0,bit7-bit1表示长度值。
例子:38表示为00100110
大于127:由多个字节组成
第一个字节:bit8=1,bit7-bit1表示存放长度所占字节数(通俗的讲就是后面还有几个字节)
其余字节:存放长度值
例如:201表示为10000001 11001001
长度值不定:用0x80表示。
不同的类型其值不同,但归根结底类型都是二进制,或十进制,或十六进制 ,或者是ASCLL字符,将他们转换为16进制表示出来即可。
结束标识字段(不在TLV之中):
两个字节,只有在长度值不定时才会出现。表示为0x000x00
PEM(PKCS#1、PKCS#8)格式定义了DER编码后的ASN.1类型数据和其他杂项,如加密算法、签名算法等如何编码。PEM格式本质上是ASN.1类型数据在文本形式下的表示,因此它通常将DER编码后的ASN.1类型数据转换为BASE64编码的文本文件。
- // 将 DER 编码的证书转换为 PEM 格式
- openssl x509 -inform der -in my_cert.crt -out my_cert.pem
DER 编码的数字证书的扩展名通常是 .cer。该类型证书采用DER编码规范,并通常包含相应的公共密钥。除此之外,DER编码也可以用于其他格式的证书,例如X.509 SSL 证书和 PGP 证书。
数字证书的扩展名取决于证书格式。除了 .cer 之外,某些数字证书的扩展名还包括 .pem、.crt、.pfx、.p12等。
在Java中, DER 编码通常用于与数字证书和密钥存储器进行交互,例如 Keystore、Truststore、PKCS12等。
要实现DER编码的格式,需要使用Java Security API中的一些类,如X.509证书和ASN.1 DER编码的SubjectPublicKeyInfo结构。
- // 获取DER编码的公钥
- public static byte[] getDEREncodedPublicKey(PublicKey publicKey) throws IOException
- {
- X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey.getEncoded());
- ASN1Object asn1Object = ASN1Sequence.getInstance(x509EncodedKeySpec.getEncoded());
- SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(asn1Object);
- return subjectPublicKeyInfo.getEncoded();
- }
DER编码形式可以用于存储和传输多种类型的证书,包括 TLS 证书、数字签名证书和代码签名证书等。DER证书可以用于实现安全通信、身份验证和代码签名,并已广泛应用于各种各样的互联网应用中。
下面是一个使用Java代码进行DER证书解析的例子:
- // Load DER certificate
- CertificateFactory cf = CertificateFactory.getInstance("X.509");
- InputStream certificateIs = new FileInputStream("my_cert.cer");
- X509Certificate cert = (X509Certificate) cf.generateCertificate(certificateIs);
-
- // Extract information
- System.out.println("Subject: " + cert.getSubjectDN());
- System.out.println("Issuer: " + cert.getIssuerDN());
- System.out.println("Serial number: " + cert.getSerialNumber());
- System.out.println("Public key: " + cert.getPublicKey());
- System.out.println("Validity period: " + cert.getNotBefore() + " - " + cert.getNotAfter());
- System.out.println("Signature algorithm: " + cert.getSigAlgName());
以上就是关于 DER 编码的详细阐述。通过本文,我们了解到Der编码是ASN.1数据结构在ASN.1DER标准下打包的二进制编码的格式规范。ASN.1规范的编码方式非常灵活,几乎可以描述任何数据类型。在实际应用中,DER编码的格式被应用于各种数字证书和密钥管理器中。