在RFC系列(https://www.ietf.org/rfc.html)文档中,对于数据的封装格式,一般采用ASN.1编码形式描述。这样做的原因在于:ASN.1编码是一种与软硬件无关的数据格式定义方法,具有普适性。在前一篇博文中,介绍过ASN.1对bitstring类型的编码方法,在本文中将举例说明ASN.1 bitstring在RFC文档中的应用。
在RFC5280 《Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile》中的4.2.1.3. Key Usage部分,使用bitstring类型描述密钥用途,如下所示:
KeyUsage ::= BIT STRING {
digitalSignature (0),
nonRepudiation (1), -- recent editions of X.509 have
-- renamed this bit to contentCommitment
keyEncipherment (2),
dataEncipherment (3),
keyAgreement (4),
keyCertSign (5),
cRLSign (6),
encipherOnly (7),
decipherOnly (8) }
比特串中不同位置的比特,如果值为1,表示具有该比特位对应的密钥用途;如果值为0,表示不具备该比特位的密钥用途。在上面的例子中,比特位从0开始计,比特位置与密钥用途的对应关系如下图:
如果一张数字证书的密钥用途是keyCertSign,则应将上图中第5比特位的值设为1,那么此时表示密钥用途的比特串为{0, 0, 0, 0, 0, 1, 0, 0, 0}。由于一般使用DER编码,要求当一个比特串作为编码器的输入时,其最后一个比特必须为1,所以需要去掉最后一个比特1之后的所有比特0,此时密钥用途比特串的值应该表示为:{0, 0, 0, 0, 0, 1}。对这个比特串进行DER编码,得到的编码结果为:0x3 0x2 0x2 0x4,编码过程如下图:
在Windows中查看一张密钥用途为keyCertSign的证书,显示内容如下:
用Asn1View工具查看这张证书的密钥用途部分,显示如下:
同一张数字证书可能会具有多种密钥用途,此时可能会有多个比特位的值为1。比如一张数字证书具有的密钥用途包括以下几种:digitalSignature,nonRepudiation,keyCertSign,cRLSign,使用比特串表示时应写为:{1, 1, 0, 0, 0, 1, 1, 0, 0}。对这个比特串进行编码的过程如下:
在Windows中查看一张密钥用途包括digitalSignature,nonRepudiation,keyCertSign,cRLSign的证书,显示内容如下:
用Asn1View工具查看这张证书的密钥用途部分,显示如下: