Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析安全证书子组件?_Java_Regex_Ldap_Certificate - Fatal编程技术网

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

Java 如何解析安全证书子组件?,java,regex,ldap,certificate,Java,Regex,Ldap,Certificate,我正在读一份安全证书上的主题,该证书的格式如下 CN=x,OU=y,O=z,ST=v,C=COM 我想解析这个字符串,只获取CN。有什么简单的方法可以做到这一点吗?您可以使用jndi的CompoundName Name dn = parser.parse("CN=x,OU=y,O=z,ST=v,C=COM"); dn.get(dn.size()); 举个例子,看看这个 编辑:添加了一个工作示例 public static void main(String args[]){ try

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

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

我想解析这个
字符串
,只获取
CN
。有什么简单的方法可以做到这一点吗?

您可以使用jndi的CompoundName

Name dn = parser.parse("CN=x,OU=y,O=z,ST=v,C=COM");
dn.get(dn.size());
举个例子,看看这个

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

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

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

没有试过,我就忘了:

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);
  }
}
Pattern=Pattern.compile(“CN=([^\\,])\\,”)
Matcher Matcher=pattern.Matcher(文本);
if(matcher.find())
{

对于(int index=1;indexOmnaest答案的工作版本:

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

尝试{NameParser parser=ctx.getNameParser(“”);Name dn=parser.parse(“cn=John,ou=People,o=JNDITutorial”);dn.remove(1);//ou=People dn.add(0,c=us”);//cn=John,o=JNDITutorial,c=us dn.add(“cn=fs”);//cn=fs,cn=John,o=JNDITutorial,c=us}catch(NamingException e){什么是ctx?@Mattan它是一个javax.naming.Context,有一些描述。我不明白如何解析它。我有字符串,其他什么都没有。我如何从整个字符串中获取cn?谢谢kalyan。问题是我并不总是有ldap服务器。我从客户端证书的主题字段中读取整个字符串。所以我无法连接ect到ldap服务器。你有其他解决方案吗?顺便说一句:Java 5.0已经过时一年多了,你考虑过使用Java 6吗?我看到JDK5中有解决这个问题的方案,但我不能升级我的jdk。我甚至不建议你升级到Java 5.0。;)但是如果你不能升级。。。