This question already has answers here:
How to extract CN from X509Certificate in Java?

(19个回答)


3年前关闭。




首先,我要说这是一个美学问题。我已经解决了自己的问题,我只是对更好的解决方法感到好奇。

因此,我有一个证书DN,如下所示:

CN = Jimmy Blooptoop,OU =某个地方,OU =员工,DC = Bloopsoft-Inc

现在,我想从中获取CN。在Java中,没有 native 支持就可以从X509证书中获取除完整DN之外的任何内容,而无需使用一些诸如弹力城堡之类的第三方库-我无法使用。因此,我必须将其解析出来,这不是什么大问题。唯一使它有些棘手的是,CN不会总是被格式化为<first name> <last name>。通常,它实际上通常是<last name>, <first name> <middle initial>。因此,在上面的示例中,CN可以是Jimmy Blooptoop或Blooptoop,Jimmy J(当然是Joop的缩写)。

在阅读了有关正则表达式的内容之后,我写了以下内容,它们足够好用:
Matcher m = Pattern.compile("CN=[A-Za-z]*[, ]*[ A-Za-z]*").matcher(dn);
if (m.find())
  cn = m.group();

我只是好奇是否有一些看起来不像废话的表情。我相当有信心,自从我阅读了正则表达式的简介后就可以解决了。

最佳答案

javax.naming.ldap.LdapName怎么样?

String dn = "CN=Jimmy Blooptoop,OU=Someplace,OU=Employees,DC=Bloopsoft-Inc";
LdapName ln = new LdapName(dn);

for(Rdn rdn : ln.getRdns()) {
    if(rdn.getType().equalsIgnoreCase("CN")) {
        System.err.println("CN is: " + rdn.getValue());
        break;
    }
}

它不是最漂亮的界面,因为缺少诸如LdapName#getByType(String)之类的东西,但是它使您省去了考虑DN可能具有的奇怪功能的麻烦。

关于java - 从证书DN中解析出CN ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7933468/

10-12 04:15