如何解析安全证书子组件?

时间:2011-04-27 07:41:52

标签: java regex ldap certificate

我正在从安全证书中读取主题,该证书具有以下格式......

CN=x,OU=y,O=z,ST=v,C=COM

我想解析此String并仅获取CN。有没有简单的方法呢?

3 个答案:

答案 0 :(得分:2)

这里可以使用简单的正则表达式吗?

没有尝试过而且忘记了:

Pattern pattern  = Pattern.compile("CN=([^\\,])\\,")
Matcher matcher = pattern.matcher(text);
if ( matcher.find() )
{
  for (int index=1; index<matcher.groupCount();index++)
  {
    String cnValue = matcher.group(index);
  }
}

答案 1 :(得分:1)

Omnaest答案的工作版本:

Pattern pattern  = Pattern.compile("CN=([^\\,]*)");
Matcher matcher = pattern.matcher(text);
String cnValue = matcher.find() ? matcher.group(1) : null;

答案 2 :(得分:0)

您可以使用jndi的CompoundName

Name dn = parser.parse("CN=x,OU=y,O=z,ST=v,C=COM");
dn.get(dn.size());

有关示例,请查看此link

编辑:添加了一个工作示例

public static void main(String args[]){

    try {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:389");
        Context ctx = new InitialContext(env);
        NameParser parser = ctx.getNameParser("");
        Name dn = parser.parse("CN=x,OU=y,O=z,ST=v,C=COM");

        System.out.println(dn.size() + dn.get( dn.size() -1  ));
    }catch(NamingException e) {
        e.printStackTrace();
    }
}

要创建上下文,您必须连接到ldap服务器。它很容易做一个字符串解析并获得第一个rdn。但是不要到那儿! DN具有不同的格式。在DCE格式中,dn将分隔为CN = x / OU = y / O = z / ST = v / C = COM

编辑:添加了另一个示例,但没有连接到ldap服务器

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

public static void main(String args[]){

  try {
      LdapName dn = new LdapName("CN=x,OU=y,O=z,ST=v,C=COM");
      System.out.println(dn.get(dn.size() - 1));
  }catch (InvalidNameException e) {
      System.out.println(e.getMessage());
  }
}