如何从Java中的X509Certificate中提取CN?
2022-08-31 09:55:44
我正在使用 和 客户端证书,并希望从客户端的 .SslServerSocket
X509Certificate
目前我打电话,但这当然给了我客户端的总格式化DN。出于某种原因,我只是对DN的部分感兴趣。有没有办法提取DN的这一部分,而无需自己解析字符串?cert.getSubjectX500Principal().getName()
CN=theclient
我正在使用 和 客户端证书,并希望从客户端的 .SslServerSocket
X509Certificate
目前我打电话,但这当然给了我客户端的总格式化DN。出于某种原因,我只是对DN的部分感兴趣。有没有办法提取DN的这一部分,而无需自己解析字符串?cert.getSubjectX500Principal().getName()
CN=theclient
下面是新的未弃用的 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());
这是另一种方式。这个想法是你获得的DN是rfc2253格式,这与用于LDAP DN相同。那么为什么不重用 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());
}