문제

디지털 인증서에서 사용자 정의 확장을 읽으려고합니다. 나는 그 가치가 der에서 인코딩 된 장군이라는 것을 알고 있습니다. 쉽게 해독하고 Java 문자열을 얻는 쉬운 방법이 있습니까? 다음을 시도했지만 'S'에는 인코딩 메타 데이터 중 일부가 문자열 시작시 정크 문자로 포함됩니다.

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

이 작업을 수행하는 빠르고 쉬운 방법이 있습니까? 아니면 완전한 맹약 ASN.1 라이브러리를 사용해야합니까?

감사!

도움이 되었습니까?

해결책

바운시 캐슬 (다른 모든 것 중에서) :

인코딩 된 ASN.1 객체를 읽고 쓰는 라이브러리.

다른 팁

다음 페이지에 포함 된 지침을 사용하여 몇 가지 변경을했으며 코드는 나와 함께 제대로 작동했습니다.

초기 BC에서 1.47 이상으로 포팅 - 탄력 성의 군단 http://www.bouncycastle.org/wiki/display/ja1/porting+earlier+bc+ releases+1.47+및 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();
}

이것은 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