2011-04-27 16 views
0

我讀從安全證書,它具有以下格式的主題...如何解析安全證書子組件?

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

我要分析此String,只得到CN。有沒有簡單的方法來做到這一點?

+0

BTW:Java 5.0中已壽命結束了一年多了,你有沒有考慮使用Java 6? – 2011-04-27 08:18:53

+0

我看到在JDK5中有這個問題的解決方案,但我無法升級我的jdk。 – Mattan 2011-04-27 09:10:40

+0

我甚至不會建議你升級到Java 5.0。 ;)但如果你不能升級... – 2011-04-27 09:12:14

回答

0

您可以使用CompoundName JNDI

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

嘗試{NameParser parser = ctx.getNameParser(「」);名稱dn = parser.parse(「cn = John,ou = People,o = JNDITutorial」); dn.remove(1); // ou =人物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 2011-04-27 08:03:11

+0

@Mattan它是一些描述的javax.naming.Context。 – EJP 2011-04-27 08:31:33

+0

我無法理解如何解析它。我有字符串,沒有別的。我怎樣才能從整個字符串中獲取cn? – Mattan 2011-04-27 09:08:06

1

這裏可以使用簡單的正則表達式嗎?

沒有嘗試過了,從我的腦海:

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

工作Omnaest的回答版本:

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