查找 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
我尝试使用以下参数(当然都在 ""
内):
ssl
/ SSL
starttls
/ STARTTLS
SSL/STARTTLS
TLSv1.1
但我看不出任何变化。
我尝试在 Netbeans 中调试它并查看 ctx
变量,但要查看的内容太多,我找不到我正在寻找的正确信息。
我看的是:
ctx
- 继承
- defaultInitCtx
- clnt
- 康恩
- 袜子
- sess
- 协议版本
- 姓名
无论我在上面的代码中输入什么,它总是显示 TLSv1
。
1) 这是连接使用的协议吗?
2) 我看错变量了吗?
3) 如何确定我建立的连接使用的协议?
我发现的另一件事是在
ctx
- 继承
- defaultInitCtx
- clnt
- 康恩
- 袜子
- 继承
- 自己
- ssl上下文
- 静态
- defaultServerSSLParams
- 协议
在这里我找到了一个列表,上面写着:
SSLv2Hello
TLSv1
TLSv1.1
TLSv1.2
所以我也尝试使用 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)
我正在使用 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
我尝试使用以下参数(当然都在 ""
内):
ssl
/SSL
starttls
/STARTTLS
SSL/STARTTLS
TLSv1.1
但我看不出任何变化。
我尝试在 Netbeans 中调试它并查看 ctx
变量,但要查看的内容太多,我找不到我正在寻找的正确信息。
我看的是:
ctx
- 继承
- defaultInitCtx
- clnt
- 康恩
- 袜子
- sess
- 协议版本
- 姓名
- 协议版本
- sess
- 袜子
- 康恩
- clnt
- defaultInitCtx
无论我在上面的代码中输入什么,它总是显示 TLSv1
。
1) 这是连接使用的协议吗?
2) 我看错变量了吗?
3) 如何确定我建立的连接使用的协议?
我发现的另一件事是在
ctx
- 继承
- defaultInitCtx
- clnt
- 康恩
- 袜子
- 继承
- 自己
- ssl上下文
- 静态
- defaultServerSSLParams
- 协议
- defaultServerSSLParams
- 静态
- ssl上下文
- 自己
- 继承
- 袜子
- 康恩
- clnt
- defaultInitCtx
在这里我找到了一个列表,上面写着:
SSLv2Hello
TLSv1
TLSv1.1
TLSv1.2
所以我也尝试使用 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)