小编典典

如何从Java的X509Certificate中提取CN?

javascript java

我正在使用SslServerSocket和客户端证书,并希望从客户端的SubjectDN中提取CN X509Certificate

目前,我打电话,cert.getSubjectX500Principal().getName()但这当然给了我客户端的总格式化DN。由于某种原因,我只是对CN=theclientDN 感兴趣。有没有一种方法可以提取DN的这一部分而无需自己解析String?


阅读 395

收藏
2020-09-22

共2个答案

小编典典

这是新的不推荐使用的BouncyCastle API的一些代码。您将同时需要bcmail和bcprov发行版。

X509Certificate cert = ...;

X500Name x500name = new JcaX509CertificateHolder(cert).getSubject();
RDN cn = x500name.getRDNs(BCStyle.CN)[0];

return IETFUtils.valueToString(cn.getFirst().getValue());
2020-09-22
小编典典

这是另一种方式。这个想法是您获得的DN为rfc2253格式,与LDAPDN所使用的格式相同。那么为什么不重用LDAP API呢?

import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;

String dn = x509cert.getSubjectX500Principal().getName();
LdapName ldapDN = new LdapName(dn);
for(Rdn rdn: ldapDN.getRdns()) {
    System.out.println(rdn.getType() + " -> " + rdn.getValue());
}
2020-09-22