Java 在linux上的备用连接上引发SunCertPathBuilderException的LDAP连接

Java 在linux上的备用连接上引发SunCertPathBuilderException的LDAP连接,java,linux,ssl,ldap,Java,Linux,Ssl,Ldap,我使用以下测试代码连接到ldap服务器。它在windows上工作正常,但在linux上,当我第一次尝试运行程序时,它会连接,然后在第二次尝试时,它会抛出异常,第三次尝试时,它会成功连接,等等(即奇数执行成功,偶数执行失败),这很奇怪。我在java默认密钥库中添加了ssl证书。我正在使用Java1.8_161。密钥库位置:“/usr/java/jre1.8.0_161/lib/security/cacerts”。我正在以jar文件的形式执行代码块 Hashtable<Stri

我使用以下测试代码连接到ldap服务器。它在windows上工作正常,但在linux上,当我第一次尝试运行程序时,它会连接,然后在第二次尝试时,它会抛出异常,第三次尝试时,它会成功连接,等等(即奇数执行成功,偶数执行失败),这很奇怪。我在java默认密钥库中添加了ssl证书。我正在使用Java1.8_161。密钥库位置:“/usr/java/jre1.8.0_161/lib/security/cacerts”。我正在以jar文件的形式执行代码块

        Hashtable<String, String> ldapContextDetails = new Hashtable<>();
        ldapContextDetails.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        ldapContextDetails.put(Context.SECURITY_AUTHENTICATION, "simple");
        ldapContextDetails.put(Context.SECURITY_PRINCIPAL, "username");
        ldapContextDetails.put(Context.SECURITY_CREDENTIALS, "password");
        ldapContextDetails.put(Context.REFERRAL, "follow");
        ldapContextDetails.put("com.sun.jndi.ldap.connect.timeout", "10000");
        ldapContextDetails.put(Context.SECURITY_PROTOCOL, "ssl");

        String providerUrl =  "ldap://domain1.com:636/";
        ldapContextDetails.put(Context.PROVIDER_URL, providerUrl);
        InitialLdapContext ldapContext;
        try {
            ldapContext = new InitialLdapContext(ldapContextDetails, null);
            System.out.println("connected");
        } catch (NamingException e) {
            e.printStackTrace();
        }
Hashtable ldapContextDetails=new Hashtable();
ldapContextDetails.put(Context.INITIAL_Context_工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
ldapContextDetails.put(Context.SECURITY_身份验证,“simple”);
ldapContextDetails.put(Context.SECURITY_主体,“用户名”);
ldapContextDetails.put(Context.SECURITY_凭证,“密码”);
ldapContextDetails.put(Context.reference,“follow”);
ldapContextDetails.put(“com.sun.jndi.ldap.connect.timeout”,“10000”);
ldapContextDetails.put(Context.SECURITY_协议,“ssl”);
字符串提供程序URL=”ldap://domain1.com:636/";
ldapContextDetails.put(Context.PROVIDER\uURL,providerUrl);
初始化ldapContext ldapContext;
试一试{
ldapContext=新的初始值ldapContext(ldapContextDetails,null);
System.out.println(“已连接”);
}捕获(NamingE例外){
e、 printStackTrace();
}
更新: 我启用了ssl日志,发现在出现故障的情况下,服务器正在通过TLSv1.2建立:

1118主,读取:TLSv1.2握手,长度=1607
1119***服务器您好,TLSv1.2
如果通过TLSv1成功:

1200 main,读取:TLSv1握手,长度=2927
1201***服务器你好,TLSv1


我还检查了证书是否已过期,TLSv1.2是否不支持,但TLSv1是否支持。另外,为每个连接选择TLS协议的行为是否都是交替进行的?

显然,它后面有两个LDAP服务器,必须按照@Eugène Adell的指示添加这两个服务器的证书

听起来好像在负载平衡器后面有两个LDAP服务器,而不是一个。是的,我检查发现有两个LDAP服务器,并且只添加了一个的证书。