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

时间:2014-10-06 09:15:41

标签: java x509certificate digital-signature digital-certificate

我想从证书主题字段中检索字符串,但只检索其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字符串。 有一个简短的方法,或者我应该使用子字符串方法来获取字段,这也不是我的首选方式,因为一些certs.getName()以他们的电子邮件地址开头。

2 个答案:

答案 0 :(得分:3)

我认为没有明确的方法可以使用java API从证书中获取common name(你可以让整个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);
}

希望这有帮助,

答案 1 :(得分:0)

根据javadoc,您可以尝试以下方法:

cer.getSubjectX500Principal()