Java 查找JNDI/LDAP连接安全协议
我正在使用java(8)连接到LDAP服务器以获取一些信息。 我正在通过SSL进行此操作,但我无法确定是否实际使用了我指定的安全协议 这是我的密码:Java 查找JNDI/LDAP连接安全协议,java,ssl,ldap,jndi,Java,Ssl,Ldap,Jndi,我正在使用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.s
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;
LdapContext ctx=null;
Hashtable env=新的Hashtable();
试一试{
环境清除();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
环境投入(Context.SECURITY_主体,“用户”);
环境put(Context.SECURITY_凭证,“密码”);
环境保护协议(Context.SECURITY_PROTOCOL,ssl);
put(“com.sun.jndi.ldap.read.timeout”,5000);
put(“com.sun.jndi.ldap.connect.timeout”,5000);
env.put(Context.PROVIDER_URL,“myurl”);
ctx=新的InitialLdapContext(env,null);
}捕获(NamingException nex){
//错误在这里得到处理
}
int debug_stop=1;
在我的例子中,当连接成功建立时,这一切都是关于上下文.SECURITY\u协议的。以下是有关此参数的一些信息:
我尝试使用以下参数(当然都在“
中):
ssl
/ssl
starttls
/starttls
SSL/STARTTLS
TLSv1.1
但我看不到任何变化
我试着在Netbeans中调试它,并查看ctx
-变量,但是有太多的东西要看,以至于我找不到正确的信息
我看到的是:
ctx
- 继承的
- defaultInitCtx
- clnt
- 康涅狄格州
- 短袜
- 赛斯
- 原型
- 名字
无论我在上面的代码中输入了什么,它都会显示TLSv1
1) 这是连接使用的协议吗
2) 我看错变量了吗
3) 如何确定已建立的连接使用的协议
我发现的另一件事是
ctx
- 继承的
- defaultInitCtx
- clnt
- 康涅狄格州
- 短袜
- 继承的
- 自我
- sslContext
- 静止的
- defaultServerSSLParams
- 协议
在这里,我找到了一份清单,上面写着:
SSLv2Hello
TLSv1
TLSv1.1
TLSv1.2
因此,我尝试使用TLSv1.1
作为上述参数,但没有成功…根据您的链接(),java.naming.security.protocol
的唯一值是“ssl”
使用Context.SECURITY\u协议=“ssl”:
- 如果服务器支持,它将打开一个安全的SSL/TLS连接
- 它会失败,出现
javax.net.ssl.SSLHandshakeException
否则
使用Context.SECURITY\u PROTOCOL
=除“ssl”之外的任何其他单词,它会打开一个简单的连接(没有ssl/TLS)
因此,对于标准工厂(com.sun.jndi.ldap.LdapCtxFactory
)和“ssl”参数,您可以使用ssl/TLS连接,也可以什么都不做
使用参数-Djava.net.debug=ssl可以查看连接的许多详细信息,并可以查看连接使用的TLS和密码版本。
(请参阅)根据您的链接(),java.naming.security.protocol
的唯一值是“ssl”
使用Context.SECURITY\u协议=“ssl”:
- 如果服务器支持,它将打开一个安全的SSL/TLS连接
- 它会失败,出现
javax.net.ssl.SSLHandshakeException
否则
使用Context.SECURITY\u PROTOCOL
=除“ssl”之外的任何其他单词,它会打开一个简单的连接(没有ssl/TLS)
因此,对于标准工厂(com.sun.jndi.ldap.LdapCtxFactory
)和“ssl”参数,您可以使用ssl/TLS连接,也可以什么都不做
使用参数-Djava.net.debug=ssl可以查看连接的许多详细信息,并可以查看连接使用的TLS和密码版本。
(请参见)请将代码放在``下,使其看起来像此
感谢您提示使用-Djava.net.debug=ssl
我会尝试,但在oracle文档中还说“除了上面列出的值之外,提供商还可以支持其他安全协议”我知道服务器也允许TLS,但我无法判断连接是否实际使用了itTLS,这是SSL的后续版本。值ssl
在Context.SECURITY\u PROTOCOL
中有点混乱。Java将尝试使用最好(最强)的连接协议,在2016年,很可能是TLS。在调试输出中,我可以看到我使用了TLS%%初始化:[Session-1,TLS_RSA_WITH_AES_128_CBC_SHA]**TLS_RSA_WITH_AES_128_CBC_SHA
,尽管代码带有'env.put(Context.SECURITY_PROTOCOL,“ssl”)@OlivierT您在哪里看到调试消息?我在控制台中看到它,就在***ServerHello
消息之后。您可以添加ligneSystem.setProperty(“javax.net.debug”、“ssl”)
在您的代码中,而不是VM参数中,请将代码放在``下,使其看起来像此
感谢您提示使用-Djava.net.debug=ssl
我会尝试,但在oracle文档中,它还说“除了上面列出的值之外,提供商还可以支持其他安全协议”我知道服务器也允许TLS,但我无法判断连接是否实际使用了itTLS,这是SSL的后续版本。值ssl
在Context.SECURITY\u PROTOCOL
中有点混乱。Java将尝试使用最好(最强)的连接协议,在2016年,很可能是TLS。在调试输出中,我可以看到