2

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

回答

0

按照javadoc,你可以尝试以下方法:

cer.getSubjectX500Principal() 
+0

我收到了与我的方法和您的建议完全相同的结果。 – caniaskyouaquestion 2014-10-06 09:50:48

+0

所以仍然在寻找一个解决方案@funtik – caniaskyouaquestion 2014-10-06 09:57:23

+0

嗯......我没有想法:)检查证书是否以正确的方式生成 – WeMakeSoftware 2014-10-06 11:11:49

2

我认为,没有明确的方法使用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); 
} 

希望这有助于

+0

拉出CN领域谢谢..将尝试你的代码,我已经解析它。但是,谢谢你,更轻松的做法是你的方式。 – caniaskyouaquestion 2014-10-06 14:01:21

+0

不客气,我看到你还有一些与数字签名和PKI相关的问题,可能你已经为他们提供了答案,但是我会试着回答一些':)'。 – albciff 2014-10-06 19:23:29

+0

是的,我设法回答了他们几乎所有的问题,但是PKCS11插槽问题仍然存在,我放弃了它,并以WINDOWS-MY的方式做到了......但是想要以另一种方式也可以这样做@albciff。非常感谢 – caniaskyouaquestion 2014-10-07 10:32:28