查找JNDI / LDAP连接安全协议

时间:2016-12-15 15:25:45

标签: java ssl ldap jndi

我正在使用java(8)连接到LDAP-Server以获取一些信息。 我是通过SSL做的,但我无法弄清楚我的指定安全协议是否真正被使用....

这是我的代码:

LdapContext ctx = null;
Hashtable<String, String> env = new Hashtable <String, String>();
try{
    env.clear();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.SECURITY_PRINCIPAL, "user");
    env.put(Context.SECURITY_CREDENTIALS, "password");
    env.put(Context.SECURITY_PROTOCOL, "ssl");
    env.put("com.sun.jndi.ldap.read.timeout", 5000);
    env.put("com.sun.jndi.ldap.connect.timeout", 5000);
    env.put(Context.PROVIDER_URL, "myurl");
    ctx = new InitialLdapContext(env, null);
} catch(NamingException nex) {
    // Errors get treated here
}
int debug_stop = 1;

在我的情况下,所有关于Context.SECURITY_PROTOCOL的连接都已成功建立。以下是有关此参数的一些信息:https://docs.oracle.com/javase/8/docs/technotes/guides/jndi/jndi-ldap-gl.html#protocol

我尝试了以下参数(当然都在""内):

  • ssl / SSL
  • starttls / STARTTLS
  • SSL/STARTTLS
  • TLSv1.1

但我看不出任何改变。

我尝试在Netbeans中调试它并查看ctx - 变量,但有很多东西要看,我找不到我正在寻找的正确信息。

我看到的是:

CTX

  • 继承
    • defaultInitCtx中
      • CLNT
        • 康恩
          • 短袜
            • SESS
              • protocolVersion
                • 名称

无论我在上面的代码中输入什么,这总是说TLSv1

1)这是连接使用的协议吗?

2)我看错了变量吗?

3)如何确定我建立的连接使用哪种协议?

我发现的另一件事是

CTX

  • 继承
    • defaultInitCtx中
      • CLNT
        • 康恩
          • 短袜
            • 继承
                • 的SSLContext
                  • 静态
                    • defaultServerSSLParams
                      • 协议

我在这里找到了一个列表:

  • SSLv2Hello
  • TLSv1
  • TLSv1.1
  • TLSv1.2

所以我尝试使用TLSv1.1作为上面的参数,但没有成功......

1 个答案:

答案 0 :(得分:2)

根据您的链接(http://docs.oracle.com/javase/8/docs/technotes/guides/jndi/jndi-ldap-gl.html),java.naming.security.protocol的唯一值是&#34; ssl&#34;。

使用Context.SECURITY_PROTOCOL =&#34; ssl&#34; :

  • 如果服务器支持它,它会打开一个安全的SSL / TLS连接
  • javax.net.ssl.SSLHandshakeException否则
  • 失败

Context.SECURITY_PROTOCOL =除了&#34; ssl&#34;之外的任何其他字,它会打开一个简单的连接(没有SSL / TLS)

因此,使用标准工厂(com.sun.jndi.ldap.LdapCtxFactory)和&#34; ssl&#34; param,你使用SSL / TLS连接或什么都不做。

您可以使用参数 -Djava.net.debug = ssl 查看许多连接的详细信息,并可以查看您的连接使用的是哪个版本的TLS和密码。 (见http://www.herongyang.com/JDK/SSL-Socket-Communication-Debug-javax-net-debug.html