Frage

Ich versuche, eine benutzerdefinierte Erweiterung aus einem digitalen Zertifikat zu lesen. Ich weiß, dass der Wert ein GeneralString in DEM-codiert ist. Gibt es einen einfachen Weg, um es richtig zu dekodieren und einen Java-String zu bekommen? Ich habe versucht, die folgenden, aber ‚s‘ enthält zu Beginn der Zeichenfolge einige der Codierung von Metadaten als Junk-Zeichen.

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

Gibt es eine schnelle und einfache Möglichkeit, dies zu tun? Oder brauche ich wirklich eine vollwertige ASN.1-Bibliothek benutzen?

Danke!

War es hilfreich?

Lösung

BouncyCastle ist (unter alles andere):

  

Eine Bibliothek zum Lesen und Schreiben codierten ASN.1-Objekten.

Andere Tipps

Anweisungen verwendet auf der folgenden Seite enthalten Ich habe einige Änderungen vorgenommen und der Code arbeitete mit mir in Ordnung.

Portierungs aus früheren BC Versionen 1.47 und später - Die Legion der Hüpfburg http://www.bouncycastle.org/ wiki / Anzeige / JA1 / Porting + von + früher + BC + Veröffentlichungen + bis + 1,47 + und + später

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

Dies erweist sich als recht einfach zu sein mit 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();
}

JcaX509ExtensionUtils tut, was die Antworten oben auf viel einfachere Art und Weise zu tun.

X509Certificate certificate;
byte[] encodedExtensionValue = certificate.getExtensionValue(oid);
if (encodedExtensionValue != null) {
    ASN1Primitive extensionValue = JcaX509ExtensionUtils
            .parseExtensionValue(encodedExtensionValue);
    String values = extensionValue.toString();          
}

In Oracle VM (JDK 7):

    DerValue val = new DerValue(ext);
    String s = val.getGeneralString();

http://www.docjar.com/docs /api/sun/security/util/DerValue.html

Hinweis: Die ursprüngliche Frage forderte eine „quick-and-dirty“ Lösung, so dass ich denke, das gilt damals war, aber da es auf der Sonne internen API basiert, soll es nicht mehr besonders seit JDK 9 verwendet werden, ab.

Bouncy Castle ist die richtige Lösung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top