当前位置: 首页 > 面试题库 >

jndi LDAPS定制HostnameVerifier和TrustManager

东方琪
2023-03-14
问题内容

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

现有的连接代码如下:

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应该在这里更加灵活…



 类似资料:
  • 这里是优化 HTML5 Boilerplate 主题的一些建议。因为并不是所有的特性都适合具体的需求,所以我们没有默认导入这些特性。 App Stores 安装 Chrome 插件 用户可以直接从网站安装 Chrome 应用,前提是该应用已经通过谷歌的网络管理工具接驳了网站。更多信息详见内置 Chrome 商店的开发文档。 <link rel="chrome-webstore-item" href

  • 注意:本书中的 Service Mesh 章节已不再维护,请转到 istio-handbook 中浏览。 例如Istio这样的Service Mesh中有很多地方可以给大家定制,例如作为数据平面的sidecar,虽然默认使用的是Envoy,但是你可以开发自己的sidecar代理;还有Mixer中的各种adpater,你也可以开发自己的adapter来扩展遥测和鉴权功能,Consul Connect

  • 我正在开发一个Java程序,它将向我的公司使用的网站发送POST请求。我们不拥有这个网站,他们与我们分开。我一直在与各种方法进行斗争,以实际传递它所需要的非常挑剔的参数,以便我从程序中对它进行工作(而不是手动进行)。 我发现Apache HttpClient4.3似乎是我试图访问它的最佳途径,任何事情都会导致网站的愤怒回应,告诉我我的用户名和密码是无效的/授权的。 一些狩猎使我使用了一个验证器,它

  • 在这一步中,我们会改进我们APP获取数据的方式。 请重置工作目录: git checkout -f step-11 对我们应用所做的最后一个改进就是定义一个代表RESTful客户端的定制服务。有了这个客户端我们可以用一种更简单的方式来发送XHR请求,而不用去关心更底层的$http服务(API、HTTP方法和URL)。 步骤9和步骤10之间最重要的不同在下面列出。你可以在GitHub里看到完整的差别

  • 6.3 使用和定制Downloader WebMagic的默认Downloader基于HttpClient。一般来说,你无须自己实现Downloader,不过HttpClientDownloader也预留了几个扩展点,以满足不同场景的需求。 另外,你可能希望通过其他方式来实现页面下载,例如使用SeleniumDownloader来渲染动态页面。

  • 6.2 使用和定制Scheduler Scheduler是WebMagic中进行URL管理的组件。一般来说,Scheduler包括两个作用: 对待抓取的URL队列进行管理。 对已抓取的URL进行去重。 WebMagic内置了几个常用的Scheduler。如果你只是在本地执行规模比较小的爬虫,那么基本无需定制Scheduler,但是了解一下已经提供的几个Scheduler还是有意义的。 类 说明 备