📜  java 从 dn 中取出 cn - Java (1)

📅  最后修改于: 2023-12-03 15:31:33.011000             🧑  作者: Mango

Java 从 DN 中取出 CN

在 X.509 的证书中,DN(Distinguished Name)是一个用于识别证书所提供信息的结构。DN 包含多个 RDN(Relative Distinguished Name),RDN 由多个属性名和属性值组成。其中一个重要的 RDN 就是 CN(Common Name),CN 定义了证书中的实体名称。

在 Java 中,我们可以使用 javax.naming.ldap.LdapName 来解析 DN,然后从中取出 CN。以下是一个示例代码:

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

public class DnParser {
    public static String getCommonName(String dn) throws InvalidNameException {
        LdapName ldapName = new LdapName(dn);
        for (Rdn rdn : ldapName.getRdns()) {
            if (rdn.getType().equalsIgnoreCase("CN")) {
                return rdn.getValue().toString();
            }
        }
        return null;
    }
}

使用该类可以很容易地从 DN 中取出 CN:

String dn = "CN=John Doe,OU=Users,DC=example,DC=com";
String cn = DnParser.getCommonName(dn);
System.out.println(cn);  // 输出 John Doe

此外,我们还可以使用正则表达式来提取 DN 中的 CN:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DnParser {
    public static String getCommonName(String dn) {
        Pattern pattern = Pattern.compile("CN=([^,]+).*");
        Matcher matcher = pattern.matcher(dn);
        if (matcher.matches()) {
            return matcher.group(1);
        }
        return null;
    }
}

然后可以像下面这样使用该方法:

String dn = "CN=John Doe,OU=Users,DC=example,DC=com";
String cn = DnParser.getCommonName(dn);
System.out.println(cn);  // 输出 John Doe

当然,使用正则表达式可能比使用 LdapName 更加简洁,但是不能忽略正则表达式的缺点,即容错性不如专门的解析器。就代码的可读性和可维护性而言,建议使用 LdapName 来解析 DN。