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

发布于 2024-11-03 07:13:51 字数 158 浏览 0 评论 0原文

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

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

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

I'm reading the subject from a security certificate, which has the following format...

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

I want to parse this String and get the CN only. Is there any easy way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

长安忆 2024-11-10 07:13:51

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

没有尝试过,就超出了我的想象:

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

Is it possible to use simple regular expressions here?

Without tried it and out of my mind:

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);
  }
}
似狗非友 2024-11-10 07:13:51

Omnaest 答案的工作版本:

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

Working version of Omnaest's answer:

Pattern pattern  = Pattern.compile("CN=([^\\,]*)");
Matcher matcher = pattern.matcher(text);
String cnValue = matcher.find() ? matcher.group(1) : null;
因为看清所以看轻 2024-11-10 07:13:51

您可以使用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());
  }
}

You can use CompoundName of jndi

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

For an example have a look at this link

Edit: Added a working example

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

To create the context you have to connect to a ldap server however. Its easy to do a string parsing and get the first rdn. But do not get there! The DN have different formats. In DCE format the dn will be separated as CN=x/OU=y/O=z/ST=v/C=COM

EDIT: Added another example without connecting to ldap server

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());
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文