X509Certificte.getExtensionValue("2.5.29.32") 返回的 OID 中的这些字节是什么?
What are these Bytes in the OID returned by X509Certificte.getExtensionValue("2.5.29.32")?
我正在从 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 的标签(所有 SEQUENCE 值都是 CONSTRUCTED,但仍然如此)。
13是长度值,两个字节后的11也是。
6
(又名 0x06
)是 OBJECT IDENTIFIER(又名 OID)的标签,9 是它的长度。
所以 30 0D 30 0B 06 09 ...
是 SEQUENCE(SEQUENCE(OID(... [ 9 bytes ])))
。
如果有人对我为此编写的代码感兴趣...
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();
}
我正在从 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 的标签(所有 SEQUENCE 值都是 CONSTRUCTED,但仍然如此)。
13是长度值,两个字节后的11也是。
6
(又名 0x06
)是 OBJECT IDENTIFIER(又名 OID)的标签,9 是它的长度。
所以 30 0D 30 0B 06 09 ...
是 SEQUENCE(SEQUENCE(OID(... [ 9 bytes ])))
。
如果有人对我为此编写的代码感兴趣...
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();
}