Java에서 DER 인코딩 된 문자열을 어떻게 디코딩합니까?
문제
디지털 인증서에서 사용자 정의 확장을 읽으려고합니다. 나는 그 가치가 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 이후에 더 이상 사용해서는 안됩니다.
탄력성 성은이를위한 적절한 솔루션입니다.