查找 JNDI/LDAP 连接安全协议

Finding JNDI/LDAP Connection Security Protocol

我正在使用 java (8) 连接到 LDAP 服务器以获取一些信息。 我正在通过 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

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

但我看不出任何变化。

我尝试在 Netbeans 中调试它并查看 ctx 变量,但要查看的内容太多,我找不到我正在寻找的正确信息。

我看的是:

ctx

无论我在上面的代码中输入什么,它总是显示 TLSv1

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

2) 我看错变量了吗?

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

我发现的另一件事是在

ctx

在这里我找到了一个列表,上面写着:

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

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

Context.SECURITY_PROTOCOL="ssl":

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

使用 Context.SECURITY_PROTOCOL=除 "ssl" 以外的任何其他词,它会打开一个简单的连接(没有 SSL/TLS)

因此,对于标准工厂 (com.sun.jndi.ldap.LdapCtxFactory) 和 "ssl" 参数,您可以使用 SSL/TLS 连接或什么也不做。

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