我正在使用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
无论我在上面的代码中输入什么,这总是说TLSv1
。
1)这是连接使用的协议吗?
2)我看错了变量吗?
3)如何确定我建立的连接使用哪种协议?
我发现的另一件事是
CTX
我在这里找到了一个列表:
SSLv2Hello
TLSv1
TLSv1.1
TLSv1.2
所以我尝试使用TLSv1.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; :
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)