我想从证书主题字段中检索字符串,但只检索其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()以他们的电子邮件地址开头。
答案 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()