2010-03-09 20 views
14

मैं डिजिटल प्रमाणपत्र से एक कस्टम एक्सटेंशन पढ़ने की कोशिश कर रहा हूं। मुझे पता है कि मूल्य डीईआर में एन्कोडेड एक सामान्य स्ट्रिंग है। क्या इसे सही तरीके से डीकोड करने और जावा स्ट्रिंग प्राप्त करने का कोई आसान तरीका है? मैंने निम्नलिखित की कोशिश की, लेकिन 'एस' में कुछ एन्कोडिंग मेटाडेटा स्ट्रिंग की शुरुआत में जंक वर्णों के रूप में शामिल है।मैं जावा में एक डीईआर एन्कोडेड स्ट्रिंग कैसे डीकोड करूं?

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 साल पहले था। मैं अभी भी किसी भी चीज़ में जावा का उपयोग नहीं कर रहा हूं इसलिए मुझे यकीन नहीं है कि अगर मैं इसे फिर से कोशिश करने के लिए चारों ओर हो सकता हूं। – Ragesh

+0

सही आप उत्तर देने के लिए धन्यवाद! – user1513388

10

का उपयोग करते हुए निम्न पृष्ठ पर निहित निर्देशों मैं कुछ परिवर्तन किए हैं और कोड मेरे साथ ठीक काम किया। 1.47 और बाद में करने के लिए पहले ईसा पूर्व रिलीज से

Porting - Bouncy कैसल 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();   
} 
संबंधित मुद्दे