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。;)但是如果你不能升级。。。