如何在Java中解码DER编码的字符串?
问题描述:
我正在尝试从数字证书中读取自定义扩展名。我知道该值是在DER中编码的GeneralString。有没有简单的方法来正确解码并获得Java字符串?我尝试了以下内容,但's'在字符串的开始处包含一些编码元数据作为垃圾字符。如何在Java中解码DER编码的字符串?
byte[] ext = cert.getExtensionValue("1.2.3.4");
String s= new String(ext);
System.out.println(s);
是否有一个快速简便的方法来做到这一点?或者我真的需要使用一些完整的ASN.1库吗?
谢谢!
答
这原来是非常简单与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();
}
答
包含在下页上的使用说明我已经做了一些修改和代码工作的罚款和我在一起。
从早期版本的BC移植到1.47以后 - 的充气城堡 http://www.bouncycastle.org/wiki/display/JA1/Porting+from+earlier+BC+releases+to+1.47+and+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();
}
答
JcaX509ExtensionUtils
军团做什么的答案在一个更简单的方式做以上。
X509Certificate certificate;
byte[] encodedExtensionValue = certificate.getExtensionValue(oid);
if (encodedExtensionValue != null) {
ASN1Primitive extensionValue = JcaX509ExtensionUtils
.parseExtensionValue(encodedExtensionValue);
String values = extensionValue.toString();
}
答
在Oracle VM:
DerValue val = new DerValue(ext);
String s = val.getGeneralString();
http://www.docjar.com/docs/api/sun/security/util/DerValue.html
喜看起来像DERObject已被弃用。任何机会,你可以更新你的代码示例。想想你现在必须使用org.bouncycastle.sasn1.Asn1Object,但我还没有能够使它工作。 – user1513388 2012-11-04 22:26:15
@ user1513388对不起,这是2年多前。我现在甚至没有在任何东西中使用Java,所以我不确定是否/当我可能会尝试再次尝试。 – Ragesh 2012-11-05 07:26:46
正确的感谢您的回复! – user1513388 2012-11-05 10:31:02