2010-03-09 3 views
14

Я пытаюсь прочитать пользовательское расширение из цифрового сертификата. Я знаю, что значение является генератором, закодированным в DER. Есть ли простой способ правильно декодировать его и получить строку Java? Я попробовал следующее, но 's' включает некоторые метаданные кодирования в качестве нежелательных символов в начале строки.Как декодировать закодированную строку DER в Java?

byte[] ext = cert.getExtensionValue("1.2.3.4"); 
String s= new String(ext); 
System.out.println(s); 

Есть ли простой и легкий способ сделать это? Или мне действительно нужно использовать некоторую полноценную библиотеку ASN.1?

Спасибо!

ответ

6

BouncyCastle является (среди всего прочего):

Библиотека для чтения и записи, закодированные объекты ASN.1.

9

Это оказывается довольно просто с 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(); 
} 
+1

Привет выглядит DERObject устарела. Любой шанс вы можете обновить пример кода. Подумайте, теперь вам нужно использовать org.bouncycastle.sasn1.Asn1Object, но я пока не смог заставить его работать. – user1513388

+0

@ user1513388 Прошу прощения, это было более 2 лет назад. Я даже не использую Java в чем-то прямо сейчас, поэтому я не уверен, если/когда я смогу снова попробовать это. – Ragesh

+0

Право вас за благодарность! – user1513388

10

Используя инструкции, содержащиеся на следующей странице я сделал некоторые изменения и код работал хорошо со мной.

Портирование с более ранними версиями BC 1,47 и позже - Легион Надувной замок http://www.bouncycastle.org/wiki/display/JA1/Porting+from+earlier+BC+releases+to+1.47+and+later

private String getExtensionValue(X509Certificate X509Certificate, String oid) throws IOException 
{ 
    String decoded = null; 
    byte[] extensionValue = X509Certificate.getExtensionValue(oid); 

    if (extensionValue != null) 
    { 
     ASN1Primitive derObject = toDERObject(extensionValue); 
     if (derObject instanceof DEROctetString) 
     { 
      DEROctetString derOctetString = (DEROctetString) derObject; 

      derObject = toDERObject(derOctetString.getOctets()); 
      if (derObject instanceof ASN1String) 
      { 
       ASN1String s = (ASN1String)derObject; 
       decoded = s.getString(); 
      } 

     } 
    } 
    return decoded; 
} 

/** 
* From http://stackoverflow.com/questions/2409618/how-do-i-decode-a-der-encoded-string-in-java 
*/ 
private ASN1Primitive toDERObject(byte[] data) throws IOException 
{ 
    ByteArrayInputStream inStream = new ByteArrayInputStream(data); 
    ASN1InputStream asnInputStream = new ASN1InputStream(inStream); 

    return asnInputStream.readObject(); 
} 
1

JcaX509ExtensionUtils делает то, что ответы выше делать в гораздо более простым способом.

X509Certificate certificate; 
byte[] encodedExtensionValue = certificate.getExtensionValue(oid); 
if (encodedExtensionValue != null) { 
    ASN1Primitive extensionValue = JcaX509ExtensionUtils 
      .parseExtensionValue(encodedExtensionValue); 
    String values = extensionValue.toString();   
} 
Смежные вопросы