我有一个以(可变长度)DER格式的X.509证书开头的字节数组。
证书之后,有更多字节包含无关数据。
如何在不知道其长度的情况下从字节数组中仅提取属于证书的字节(我将使用Java)?
答案 0 :(得分:3)
证书必须使用尊重的编码规则进行编码,使用找到here的ASN.1定义。
首先读取序列标签(一个字节,检查它是否具有值30
十六进制)。
现在解析DER长度字段。这被编码为单个字节,最大值为128.对于128到256的长度,将有两个字节(十六进制为81 XX
,其中XX为无符号值)。然后你得到两个字节,值长度从256到64KiB,以十六进制编码为82 XX XX
,再次作为大端无符号值。如果证书超过64KiB,即使您可以猜测长度的下一个编码,您也可能遇到麻烦。
所以现在你应该添加标签长度(1),长度编码的长度(可能是3个字节)和值的长度。这将为您提供整个证书的大小。将其读入缓冲区或创建一些有界输入流并将其提供给X509Certificate
的{{1}}工厂方法。
快乐的编码。