Я пытаюсь считать пользовательское расширение из цифрового сертификата. Я знаю, что значением является GeneralString, закодированный в DER. Существует ли простой способ правильно декодировать его и получить Строку Java? Я попробовал следующее, но' включает некоторые метаданные кодирования как символы спама в начале строки.
byte[] ext = cert.getExtensionValue("1.2.3.4");
String s= new String(ext);
System.out.println(s);
Существует ли быстрый и простой способ сделать это? Или я должен действительно пользоваться некоторой абсолютной библиотекой ASN.1?
Спасибо!
BouncyCastle (среди прочего):
Библиотека для чтения и записи закодированных объектов ASN.1.
Оказывается, с BouncyCastle это довольно просто:
private String getExtensionValue(X509Certificate X509Certificate, String oid) throws IOException
{
String decoded = null;
byte[] extensionValue = X509Certificate.getExtensionValue(oid);
if (extensionValue != null)
{
DERObject derObject = toDERObject(extensionValue);
if (derObject instanceof DEROctetString)
{
DEROctetString derOctetString = (DEROctetString) derObject;
derObject = toDERObject(derOctetString.getOctets());
if (derObject instanceof DERUTF8String)
{
DERUTF8String s = DERUTF8String.getInstance(derObject);
decoded = s.getString();
}
}
}
return decoded;
}
private DERObject toDERObject(byte[] data) throws IOException
{
ByteArrayInputStream inStream = new ByteArrayInputStream(data);
ASN1InputStream asnInputStream = new ASN1InputStream(inStream);
return asnInputStream.readObject();
}