どのように私はJavaでDERエンコードされた文字列をデコードしますか?

StackOverflow https://stackoverflow.com/questions/2409618

  •  18-09-2019
  •  | 
  •  

質問

私は、デジタル証明書からのカスタム拡張を読み込むしようとしています。私は値がDERでエンコードGeneralStringであることを知っています。それを正しくデコードし、Javaの文字列を取得する簡単な方法はありますか?私は次のことを試してみましたが、「s」は文字列の先頭にジャンク文字としてエンコーディングメタデータの一部が含まれます。

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

これを行うために迅速かつ簡単な方法はありますか?それとも私は実際にいくつかの本格的なASN.1ライブラリを使用する必要があるのですか?

ありがとうございます。

役に立ちましたか?

解決

はBouncyCastle を(他のすべての中で)です。

  

、読み書きエンコードされたASN.1オブジェクト用のライブラリます。

他のヒント

私はいくつかの変更を加えたし、コードは私と一緒にうまく働い次のページで含まれる命令を使用します。

弾む城の軍隊する -

1.47に以前BCリリースから移植し、後で http://www.bouncycastle.org/ウィキ/ディスプレイ+以前のBC +から/ JA1 /移植+ + +リリースに+ 1.47 +と+以降の

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

このはは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は、上記の答えははるかに簡単な方法で、何をするかします。

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

は、Oracle VM(JDK 7)において

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

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

注:「間に合わせと-」ソリューションを呼びかけ元の質問、私は、これは当時有効だったと思うが、それは、Sun内部APIに依存していることから、それは特にJDK 9ので、もはや使用すべきではありません以降ます。

弾む城は、このための適切な解決策である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top