如何在 Java 中解码 DER 编码的字符串?
我正在尝试从数字证书读取自定义扩展。我知道该值是以 DER 编码的 GeneralString。有没有一种简单的方法可以正确解码它并获取 Java 字符串?我尝试了以下操作,但 's' 在字符串开头包含一些编码元数据作为垃圾字符。
byte[] ext = cert.getExtensionValue("1.2.3.4");
String s= new String(ext);
System.out.println(s);
有没有一种快速且简单的方法可以做到这一点?或者我真的需要使用一些成熟的 ASN.1 库吗?
谢谢!
I'm trying to read a custom extension from a digital certificate. I know the value is a GeneralString encoded in DER. Is there an easy way to correctly decode it and get a Java String? I tried the following, but 's' includes some of the encoding metadata as junk characters at the start of the string.
byte[] ext = cert.getExtensionValue("1.2.3.4");
String s= new String(ext);
System.out.println(s);
Is there a quick and easy way to do this? Or do I really need to use some full fledged ASN.1 library?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
使用下一页中包含的说明,我进行了一些更改,并且代码对我来说运行良好。
从早期 BC 版本移植到 1.47 及更高版本 - 充气城堡军团
http://www.bouncycastle.org/ wiki/display/JA1/Porting+from+earlier+BC+releases+to+1.47+and+later
Using instructions contained on the following page I've made some changes and the code worked fine with me.
Porting from earlier BC releases to 1.47 and later - The Legion of the Bouncy Castle
http://www.bouncycastle.org/wiki/display/JA1/Porting+from+earlier+BC+releases+to+1.47+and+later
对于 BouncyCastle 来说,这非常简单:
This turns out to be quite straightforward with BouncyCastle:
JcaX509ExtensionUtils
以更简单的方式完成上述答案的工作。JcaX509ExtensionUtils
does what the answers above do in a much simpler way.在 Oracle VM (JDK 7) 中:
http://www. docjar.com/docs/api/sun/security/util/DerValue.html
注意:最初的问题要求“快速而肮脏”的解决方案,所以我认为这在当时是有效的,但因为它依赖于 Sun 内部 API,不应该再使用它,特别是从 JDK 9 开始。
Bouncy Castle 是解决此问题的正确解决方案。
In Oracle VM (JDK 7):
http://www.docjar.com/docs/api/sun/security/util/DerValue.html
NOTE: The original question called for a "quick-and-dirty" solution, so I think this was valid back then, but since it relies on the Sun internal API, it shouldn't be used anymore especially since JDK 9 onwards.
Bouncy Castle is the proper solution for this.