我们正在编写一个应连接到不同的LDAP服务器的应用程序。对于每台服务器,我们只能接受某个证书。该证书中的主机名称无关紧要。这很简单,因为我们使用LDAP和STARTTLS,因为我们可以使用StartTlsResponse.setHostnameVerifier(..-)
并使用StartTlsResponse.negotiate(...)
和匹配的SSLSocketFactory
。但是我们也需要支持LDAPS连接。 Java本身支持这一点,但前提是服务器证书由默认的Java密钥库信任。虽然我们可以替换它,但我们仍然无法为不同的服务器使用不同的密钥库。jndi LDAPS自定义HostnameVerifier和TrustManager
现有的连接代码如下:
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, (encryption == SSL ? "ldaps://" : "ldap://") + host + ":" + port);
if (encryption == SSL) {
// env.put("java.naming.ldap.factory.socket", "CustomSocketFactory");
}
ctx = new InitialLdapContext(env, null);
if (encryption != START_TLS)
tls = null;
else {
tls = (StartTlsResponse) ctx.extendedOperation(new StartTlsRequest());
tls.setHostnameVerifier(hostnameVerifier);
tls.negotiate(sslContext.getSocketFactory());
}
我们可以添加自己出来CustomSocketFactory
,但如何对信息传递给?
所以基本上,你已经产生了你自己的答案,在我的答案的延续中,你说你已经低估了... – Bruno 2012-03-27 09:57:00
I从来没有说过你写的东西是错的,只是我的问题中已经提到了这些信息,并没有以任何方式帮助解决这个问题。这就是为什么我低估了。如果这不是一个有效的降低投票的提议,我会删除那个downvote,但是然后EJPs upvote(这只是为了清除我的downvote)留下来,投了一个无用的答案,所以我不会。 – 2012-03-28 10:29:17
正如我所说的,在编辑之前就已经足够了,但是一旦你得到了一个答案,它显示了OpenJDK代码中的原因,除非你使用静态成员(你已经完成)或者像JDNI之类的东西,否则你为什么不能做你想做的事情,我认为这是对你的问题的回答。然后,你已经接受了你自己的答案,这非常明显地符合我的建议。我不关心downvote,我不介意你已经接受了你自己的答案(因为你对ThreadLocal更具体)。我只是发现downvoting +接受自己的回答来自downvoted的答案。 – Bruno 2012-03-28 11:17:16