我有证书存储在LDAP服务器中,我们使用此证书签署将发送给其他系统的请求。
我正在使用java.security.cert.CertStore类从LDAP检索证书,
然而,当我的LDAP服务器关闭时(例如我从运行我的应用程序的服务器向ldap服务器发出了防火墙块),然后是“CertStore.getInstance(”LDAP“,ldapCertStoreParams);”没有超时并永远挂起。
我还使用了Future任务,这样我就可以暂停连接过程,以防万一它花了太长时间。即使Future任务超时但仍然尝试连接LDAP的底层线程没有超时并无限期挂起
经过一番研究后我发现有JNDI属性 com.sun.jndi.ldap.read.timeout 可以用于LDAP操作,比如设置这个在JNDI上下文中的环境变量中。
env.put(“com.sun.jndi.ldap.read.timeout”,“5000”);
如果服务器在5秒内没有回复,会导致LDAP服务提供商中止读取尝试。
但是,由于我使用的是SUN的CertStore提供程序,因此它没有任何工具来设置上述属性,因此如果LDAP服务器在指定的时间段内没有响应,则线程可能会超时。我坚持如何将此属性与CertStore对象一起使用。
当LDAP服务器无法访问时,有没有人知道如何超时 CertStore.getInstance(“LDAP”,ldapCertStoreParams) 方法?
OR是否有任何其他LDAP提供程序api正确处理死连接,可用于从LDAP检索证书。
非常感谢任何帮助
以下是从LDAP检索证书的代码段。
protected CertStore getLdapCertStore(final CertStoreParameters ldapCertStoreParams) throws InterruptedException, ExecutionException, TimeoutException {
final Callable<CertStore> connectionTask = new Callable<CertStore>() {
public CertStore call() throws InvalidAlgorithmParameterException, NoSuchAlgorithmException {
return CertStore.getInstance("LDAP", ldapCertStoreParams);
}
};
final Future<CertStore> futureConnection = getCertStoreConnectionExecutor().submit(connectionTask);
return futureConnection.get(connectionTimeoutInSeconds, TimeUnit.SECONDS);
}
private synchronized ExecutorService getCertStoreConnectionExecutor() {
if (certStoreConnectionExecutor == null) {
// We want one thread per connection-setting, as any connection attempt can hang indefinitely if the port is blocked (e.g.: by a firewall)
// NOTE: Cancelling a Future task does NOT guarantee that the associated thread will be freed and returned to the pool, as threads are not forcefully stopped (only *requested* to stop)!
certStoreConnectionExecutor = Executors.newFixedThreadPool(Math.max(1, getLdapHostAndPortList().size()));
}
return certStoreConnectionExecutor;
}
答案 0 :(得分:0)
您仍然可以通过创建jndi.properties文件来设置LDAP jndi属性,在其中可以设置连接和读取超时。尽管如此,我仍然发现LDAP证书存储存在问题,即,第一次读取尝试和证书检查进入此状态时将失败,然后在重新连接时下一次检查将成功。使用jndi池也无济于事。更糟糕的是,如果进入此状态,则enginegetcrls方法将被同步,因此,如果存在陈旧的连接,则尝试从证书存储中读取的任何其他内容都将挂起。我意识到自己已经6岁了,但是这个问题最近让我头疼。