我有一个以(可变长度)DER格式的X.509证书开头的字节数组。
在证书之后,还有更多的字节包含不相关的数据。
如何在事先不知道其长度的情况下(我将使用Java),仅从字节数组中提取属于证书的字节?
必须使用可分辨的编码规则,使用此处的ASN.1定义对证书进行编码。
首先读取序列标记(一个字节,检查其值是否为30
hex)。
现在解析DER长度字段。对于最大128的值,它被编码为单个字节。对于128到256的长度,将有两个字节(十六进制的81 XX
,其中XX是无符号值)。然后得到两个字节的值长度,从256到64KiB,用十六进制编码为82 XX XX
,同样是big-endian无符号值。如果证书超过64KiB,即使您可以猜测下一个长度编码,您也可能会遇到麻烦。
因此,现在应该将标记长度(1)、长度编码的长度(可能是3个字节)和值的长度加在一起。这将为您提供整个证书的大小。将其读入缓冲区或发明一些有界输入流,并将其交给X509Certificate
的getInstance
工厂方法。
快乐的编码。