作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想根据其公钥获取 S/MIME 证书的电子邮件地址和到期日期。这种方法可能吗?还是我完全错了?我可以解密公钥以通过java获取此类数据吗?
我在 google 中进行了搜索,阅读了 wiki 页面并阅读了有关 oracle s/mime 项目的信息。但这似乎不太可能。这些数据只能在 csr 中找到吗?
提前致谢
最佳答案
我很惊讶这不是一个骗局,但我找不到一个好的。
虽然 Bouncy 很好并且有很多功能(如果您想使用它),但核心 Java 可以永远处理 X.509 证书。对于 PEM 或 DER 格式的文件(或任何可以作为流访问的任何内容)中的证书(尽管 javadoc 对此并不清楚),您所需要的只是 CertificateFactory :
CertificateFactory fact = CertificateFactory.getInstance("X.509");
// from a real file
InputStream is = new FileInputStream ("filename");
Certificate cert = fact.generateCertificate(is);
is.close(); // or use try-resources to do automatically
// from an alternate/custom filesystem, such as a ZIP
Path p = Paths.get("somespecification"); // or any other creation of a Path
InputStream is = Files.newInputStream(p); // add open options if needed
// same as before
// from the classpath (usually a JAR)
InputStream is = ClassLoader /*or any Class<?> object*/ .getResourceAsStream("name");
// same as before
// from a byte[] in memory
InputStream is = new ByteArrayInputStream (bytearray);
// same as before, except don't really need to close
// you get the idea
尽管像这样的 JCA API 被定义为允许大量扩展,但读取 X.509 证书实际上不仅会为您提供 Certificate
,还会为您提供子类 X509Certificate
其中 .getNotAfter()
直接给出过期日期时间。电子邮件地址(如果存在)(通常 X.509 证书不需要,但在用于 S/MIME 的证书中应该始终如此)通常是主题名称中的一个属性,它实际上具有以下内部结构: Java 不允许您直接访问,因此您需要:
String x500name = ((X509Certificate)cert).getSubjectX500Principal()) .toString();
// simple case: no multivalue RDN, no reserved chars ,+="<>\;# or extra spaces
for( String attr : x500name.split(", ") )
if( attr.startsWith("EMAILADDRESS=") )
... use attr.substring(13) ...
// other cases require slightly more complicated parsing
请注意,X.509 中根本没有加密,因此没有实际的解密,尽管许多人使用“解密”来描述任何不熟悉的东西,而不是实际的密码。
关于java - 有没有办法解密S/MIME公钥数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58465375/
我是一名优秀的程序员,十分优秀!