X509Certificte.getExtensionValue( "2.5.29.32" ) 返回的 OID 中的这些字节是什么?



我正在从 X.509 证书中提取2.5.29.32证书策略 OID 字节。我没有使用BouncyCastle。

bytes = _cert.getExtensionValue("2.5.29.32");

我得到的原始字节是

4, 15, 48, 13, 48, 11, 6, 9, 96, -122, 72, 1, 101, 2, 1, 11, 42

DER 解码(类型 = 4,大小 = 15(后,我有:

48, 13, 48, 11, 6, 9, 96, -122, 72, 1, 101, 2, 1, 11, 42

我追求的是:

96, -122, 72, 1, 101, 2, 1, 11, 42 (2.16.840.1.101.2.1.11.42)

字节是多少:48, 13, 48, 11, 6, 9

48(

又名0x30(是CONSTRUCTED序列的标签(所有SEQUENCE值都是CONSTRUCTED,但仍然如此(。

13 是长度值,两个字节后面的 11 也是如此。

6(又名 0x06 (是对象标识符(又名 OID(的标签,9 是它的长度。

所以30 0D 30 0B 06 09 ... SEQUENCE(SEQUENCE(OID(... [ 9 bytes ]))).

  • ITU-T X.680-201508,ASN.1语言。
  • ITU-T X.690-201508,ASN.1数据的BER(和CER(和DER编码。

如果有人对我为此编写的代码感兴趣......

private static byte CONSTRUCTED_SEQUENCE_TAG = 48;
private static byte OID_CODE = 6;
private static String extractPolicyOid(X509Certificate pCert) throws IOException {
    byte[] _bytes = pCert.getExtensionValue("2.5.29.32");
    if (_bytes == null) {
        return null;
    }
    DerValue _der = new DerValue(new ByteArrayInputStream(_bytes));
    _bytes = _der.getOctetString();
    /*
     * Skip header goo
     */
    int _idx = 0;
    while (_idx < _bytes.length) {
        if (_bytes[_idx] == CONSTRUCTED_SEQUENCE_TAG) {
            _idx += 2;
        } else if (_bytes[_idx] == OID_CODE) {
            _idx += 2;
        } else {
            break;
        }
    }
    /*
     * Create string version of OID
     */
    StringBuffer _sb = new StringBuffer();
    byte _byte = _bytes[_idx++];
    _sb.append(_byte / 40);
    _sb.append(".");
    _sb.append(_byte % 40);
    int _accum = 0;
    for (; _idx < _bytes.length; _idx++) {
        _byte = _bytes[_idx];
        if (_byte << ~7 < 0) {
            _accum = (_byte & 0x7f) << 7;
        } else {
            _accum += _byte;
            _sb.append(".");
            _sb.append(_accum);
            _accum = 0;
        }
    }
    return _sb.toString();
}

相关内容

  • 没有找到相关文章

最新更新