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

时间:2019-04-05 00:21:47

标签: x509certificate x509

我正在从X509证书中提取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,1,11,42

在DER解码后(类型= 4,大小= 15),我得到了: 48,13,48,11,6,9,96,-122,72,1,101,2,1,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?

2 个答案:

答案 0 :(得分:0)

48(又名0x30)是CONSTRUCTED SEQUENCE的标签(所有SEQUENCE值都是CONSTRUCTED,但仍然是CONSTRUCTED)。

13是长度值,后两个字节是11。

6(又名0x06)是OBJECT IDENTIFIER(又名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编码。

答案 1 :(得分:0)

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

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();

}