从证书中检索主题/CN字段?

3
我希望从证书主题字段中检索一个字符串,但只需要它的CN值。
为了获取完整的字符串,我使用:
Enumeration enumeration = ks.aliases();
while (enumeration.hasMoreElements()) {
    String aliass = (String) enumeration.nextElement();
    X509Certificate cer = (X509Certificate) ks.getCertificate(aliass);
    String s = cer.getSubjectDN().getName().;
    System.out.println(s);
}

输出结果为:CN=某物,OU=某物,DC=某物,DC=某物,DC=某物
正如所述,我只想检索CN字符串。是否有简便的方法或者我应该使用子字符串方法来获取该字段,但这不是我首选的方式,因为一些证书.getName()是以电子邮件地址开头的。

necro-dupe https://dev59.com/4HE85IYBdhLWcg3wKwKD 和 https://dev59.com/Rmsz5IYBdhLWcg3wYGzQ。 - dave_thompson_085
ks对象从哪里来? - Özge
2个回答

4

我认为使用Java API没有明确的方法可以获取证书中的常用名称(您可以获取整个subjectDN并解析它以获取CN),如果您想要一个方法来实现这一点,请改用BouncyCastle类:

import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import org.bouncycastle.asn1.x500.RDN;
import org.bouncycastle.asn1.x500.style.IETFUtils;

Enumeration enumeration = ks.aliases();
while (enumeration.hasMoreElements()) {
    String aliass = (String) enumeration.nextElement();
    X509Certificate cer = (X509Certificate) ks.getCertificate(aliass);
    X500Name x500name = new JcaX509CertificateHolder(cert).getSubject();
    RDN cn = x500name.getRDNs(BCStyle.CN)[0];
    String s = IETFUtils.valueToString(cn.getFirst().getValue());
    System.out.println(s);
}

希望这能有所帮助,

谢谢。我会尝试你的代码,我已经解析过了。但是感谢你,用你的方法做事肯定更加简洁高效。 - caniaskyouaquestion
不用谢,我看到你有一些关于数字签名和PKI的其他问题,也许你已经得到了答案,但我会尝试回答一些 :)。 - albciff
是的,我成功回答了几乎所有的问题,但是 PKCS11 插槽问题仍然存在,我放弃了它并按照我的方式在 WINDOWS 上完成了它...但我也想用另一种方式完成 @albciff。非常感谢。 - caniaskyouaquestion

0
根据javadoc,您可以尝试以下操作:
cer.getSubjectX500Principal()

我用自己的方法和你的建议得到了完全相同的结果。 - caniaskyouaquestion
仍然在寻找解决方案 @funtik - caniaskyouaquestion
嗯...我想不出来了 :) 检查证书是否以正确的方式生成 - WeMakeSoftware
我认为你建议的函数运行良好,只是它的工作不是从证书/主题字符串中提取CN字段。 - caniaskyouaquestion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接