gpt4 book ai didi

java - jndi LDAPS 自定义 HostnameVerifier 和 TrustManager

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:14:58 43 4
gpt4 key购买 nike

我们正在编写一个应连接到不同 LDAP 服务器的应用程序。对于每个服务器,我们可能只接受特定的证书。该证书中的主机名无关紧要。这很容易,当我们使用 LDAP 和 STARTTLS 时,因为我们可以使用 StartTlsResponse.setHostnameVerifier(..-) 并使用 StartTlsResponse.negotiate(...) 与匹配SSLSocketFactory。然而,我们还需要支持 LDAPS 连接。 Java native 支持此功能,但前提是服务器证书受到默认 java keystore 的信任。虽然我们可以替换它,但我们仍然不能为不同的服务器使用不同的 keystore 。

现有连接代码如下:

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,但是如何向它传递信息呢?

最佳答案

对于其他有同样问题的人:我为我的案例找到了一个非常丑陋的解决方案:

import javax.net.SocketFactory;

public abstract class ThreadLocalSocketFactory
extends SocketFactory
{

static ThreadLocal<SocketFactory> local = new ThreadLocal<SocketFactory>();

public static SocketFactory getDefault()
{
SocketFactory result = local.get();
if ( result == null )
throw new IllegalStateException();
return result;
}

public static void set( SocketFactory factory )
{
local.set( factory );
}

public static void remove()
{
local.remove();
}

}

像这样使用它:

env.put( "java.naming.ldap.factory.socket", ThreadLocalSocketFactory.class.getName() );
ThreadLocalSocketFactory.set( sslContext.getSocketFactory() );
try {
ctx = new InitialLdapContext( env, null );
} finally {
ThreadLocalSocketFactory.remove();
}

不太好,但它有效。JNDI 应该在这里更灵活...

关于java - jndi LDAPS 自定义 HostnameVerifier 和 TrustManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394864/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com