Question

Je suis en train de lire une extension personnalisée à partir d'un certificat numérique. Je sais que la valeur est un GeneralString codé en DER. Est-il un moyen facile de décoder correctement et obtenir un String Java? J'ai essayé ce qui suit, mais l « » comprend certains des métadonnées de codage des caractères indésirables au début de la chaîne.

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

Y at-il un moyen rapide et facile de faire cela? Ou ai-je vraiment besoin d'utiliser une bibliothèque ASN.1 à part entière?

Merci!

Était-ce utile?

La solution

BouncyCastle est (parmi tout le reste):

  

Une bibliothèque pour la lecture et l'écriture des objets ASN.1 codé.

Autres conseils

Utilisation des instructions contenues dans la page suivante, je l'ai fait quelques changements et le code a bien fonctionné avec moi.

les versions antérieures de portage de la Colombie-Britannique à 1,47 et plus tard - La Légion du château Bouncy http://www.bouncycastle.org/ wiki / affichage / JA1 / + de + Porting plus tôt + BC + + versions à + 1,47 + et + plus tard

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

se révèle être assez simple avec 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 fait ce que les réponses font ci-dessus d'une manière beaucoup plus simple.

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

Dans Oracle VM (JDK 7):

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

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

NOTE: La question initiale a appelé à une solution « rapide et sale », donc je pense que cela était valable à l'époque, mais puisqu'il repose sur l'API interne Sun, il ne devrait pas être utilisé plus particulièrement depuis 9 JDK partir.

Bouncy Castle est la bonne solution pour cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top