有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在读一份安全证书上的主题,该证书的格式如下

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

我想解析这个String并只获取CN。有什么简单的方法可以做到这一点吗


共 (3) 个答案

  1. # 1 楼答案

    Omnaest答案的工作版本:

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

    您可以使用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());
      }
    }
    
  3. # 3 楼答案

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

    没有试过,我就忘了:

    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);
      }
    }