为什么Nginx以相反的顺序提供客户端SSL DN?

时间:2015-11-18 00:58:44

标签: java nginx openssl ldap spring-ldap

我很好奇为什么有些网络服务器(例如Nginx)以相反的顺序提供客户端SSL DN。

Web应用程序将DN发布到Java Web服务,该服务正在尝试创建Java javax.naming.ldap.LdapName

标准订单(LDAP或X500Name):

"CN=Jimmy Blooptoop,OU=Someplace,OU=Employees,DC=Bloopsoft-Inc"

逆序(OpenSSL Oneline格式)(Nginx返回_ $ ssl_client_s_dn _):

"/DC=Bloopsoft-Inc/OU=Employees/OU=Someplace/CN=Jimmy Blooptoop"

这是为什么?

哪一个与LDAP RFC匹配?

他们俩都这样?

有关LDAP RFC的说明:

有许多与LDAP相关的RFC:https://www.ldap.com/ldap-specifications-defined-in-rfcs

许多人提到了不同的人,这里是对他们的快速历史的尝试:

  • 1993年7月:RFC 1485 - 杰出名称的字符串表示
  • 1995年3月:RFC 1779 - 专有名称的字符串表示
  • 1997年12月:RFC 2253 - 轻量级目录访问协议(v3):可分辨名称的UTF-8字符串表示
  • 2002年9月:RFC 3377 - 轻量级目录访问协议(v3):技术规范(更新RFC 2253)
  • 2003年3月:RFC 3494 - 轻量级目录访问协议版本2(LDAPv2)到历史状态(退休RFC 1485,RFC 1779)
  • 2006年6月:RFC 4514 - 轻量级目录访问协议(LDAP):可分辨名称的字符串表示

Most Recent One,其他人已经过时了: RFC 4514: Lightweight Directory Access Protocol (LDAP): String Representation of Distinguished Names

Java Library:

是否有来回转换的Java库(从反向转换到不反转)? LdapName抛出InvalidNameException。似乎应该有,反向格式经常出现。

Java库:

Ngninx注:

链接:

1 个答案:

答案 0 :(得分:5)

  

为什么会这样?

这是因为OpenSSL返回的是什么。 Apache HTTPD做同样的事情,因为它也使用OpenSSL。

  

哪一个与LDAP RFC匹配?

您描述为'标准订单'。但是,这是SSL证书和SSL API。它与LDAP没有任何关系,没有理由说它应该符合任何LDAP RFC。它只是提供证书主题DN的另一种方式。这是由X.509定义的,而不是由LDAP定义的(尽管最终它们都是由X.500定义的,至少是最初定义的。)

  

是否存在来回转换的Java库(从反向转换为非反转)

偏离主题,而不是我所知道的,但写起来很容易:

public class OpenSSLSubjectName
{
    private String  name;

    public OpenSSLSubjectName(String name)
    {
        this.name = name;
    }

    public String   getX500Name() throws NamingException
    {
        return getLdapName().toString();
    }

    public LdapName getLdapName() throws NamingException
    {
        List<Rdn>   rdns = new LinkedList<>();
        String[]    parts = name.split("/");
        for (int i = 1; i < parts.length; i++)
        {
            rdns.add(new Rdn(parts[i]));
        }
        return new LdapName(rdns);
    }
}

E&安培; OE