Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从证书中检索主题/CN字段?_Java_X509certificate_Digital Signature_Digital Certificate - Fatal编程技术网

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

Java 从证书中检索主题/CN字段?,java,x509certificate,digital-signature,digital-certificate,Java,X509certificate,Digital Signature,Digital Certificate,我想从证书主题字段中检索字符串,但只检索其CN值 要获取我使用的整个字符串,请执行以下操作: Enumeration enumeration = ks.aliases(); while (enumeration.hasMoreElements()) { String aliass = (String) enumeration.nextElement(); X509Certificate cer = (X509Certificate) ks.getCertificate(alias

我想从证书主题字段中检索字符串,但只检索其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=something,OU=something,DC=something,DC=something,DC=something

如上所述,我只想检索CN字符串。 是否有一个简单的方法,或者我应该使用子字符串方法来获取字段,这也不是我的首选方法,因为某些cert.getName()以其电子邮件地址开头。

根据您的选择,您可以尝试以下方法:

cer.getSubjectX500Principal()

我认为没有显式方法可以使用java API从证书中获取
公共名称
(您可以获取整个
主题DN
并对其进行解析以获取
CN
),如果您想让方法这样做,请改用类:

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);
}

希望这能有所帮助,

我的方法和你的建议得到了完全相同的结果。所以仍然在寻找解决方案@funtikhmmm。。。我没有主意:)检查证书是否以正确的方式生成我认为您建议的功能运行得很好,只是从证书/主题字符串中拉出CN字段不是它的工作。谢谢..我将尝试您的代码,我已经解析了它。但是谢谢,def更灵活的方法就是你的方法。不客气,我看到你还有一些关于数字签名和PKI的其他问题,可能你已经有了答案,但是我将尝试回答一些
:)
。是的,我几乎回答了所有问题,但PKCS11插槽问题仍然存在,我转身离开了它,用我的方式做了它……但我也想用另一种方式做它@albciff。谢谢一个LOTNERCO的愚弄,ks对象是从哪里来的?