【问题标题】:How to specify SSL/TLS version on Java LDAP connection?如何在 Java LDAP 连接上指定 SSL/TLS 版本?
【发布时间】:2017-05-20 06:06:03
【问题描述】:

我正在使用 java LDAP 客户端,但我仍然缺少有关如何正确执行此操作的一些信息或知识。

我的代码如下所示:

LdapContext ctx = null;
Hashtable<String, String> env = new Hashtable <String, String>();
try{
    env.clear();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "url");
    env.put(Context.SECURITY_PRINCIPAL, "user");
    env.put(Context.SECURITY_CREDENTIALS, "password");
    env.put(Context.SECURITY_PROTOCOL, "ssl");
    env.put("java.naming.security.ssl.ciphers", "SSL_RSA_EXPORT_WITH_RC4_40_MD5");
    ctx = new InitialLdapContext(env, null);
} catch(NamingException nex) {
    // error handling
}

此时发生以下事情:

  • 在调试 ssl 连接时,我看到我的 LDAP 服务器和我的程序之间建立了 TLSv1 连接。
  • 我在 ssl 握手时看到我的客户端和服务器的以下信息:*** ClientHello, TLSv1.2*** ServerHello, TLSv1

我现在缺少的东西:

  • 我添加了一个要包含的密码,但我在客户的问候消息中提供的支持密码列表中没有看到它
  • 我没有在他的 hello 消息中指定我的客户提供 TLS1.2,该设置来自哪里?
  • 我希望能够确定自己是否要使用 TLS 或 SSL,以及将使用哪个版本的 TLS 或 SSL,我该如何实现? (所以我可以例如只允许 TLS 1.1 和 1.2)

【问题讨论】:

  • 您如何查看ClientHello? clientHello 将看到客户端知道的“密码套件”列表,按客户端偏好排序,如注册表中所示:iana.org/assignments/tls-parameters/…
  • 我正在使用-Djavax.net.debug=ssl:session 来调试 Netbeans 中的 ssl 连接。我可以看到密码列表,但它不包括我添加的密码 env.put("java.naming.security.ssl.ciphers", "SSL_RSA_EXPORT_WITH_RC4_40_MD5");
  • SSL_RSA_EXPORT_WITH_RC4_40_MD5,认真的吗?您可以放弃加密。
  • @Michael-O 仅用于演示目的,所以不用担心^^ 我必须添加一个以前不存在的,所以我只剩下“不安全”的了。
  • 看来java.naming.security.ssl.ciphers 仅受“IBM JNDI LDAP 提供程序”支持,Sun/Oracle 不支持。

标签: java ssl ldap jndi


【解决方案1】:

先扫描您的服务器,然后再将时间浪费在可能根本不起作用的东西上。使用:https://github.com/rbsec/sslscan

您的服务器可能仅支持 TLS 1.0。

【讨论】:

    【解决方案2】:

    您使用哪个 java 版本? 看来ldap服务器不支持TLSv1.2 您应该为 ldap 服务指定专用的 ssl 套接字工厂。

    env.put("java.naming.ldap.factory.socket", CustomTLSSSLSocketFactory.class.getName);
    
    CustomTLSSSLSocketFactory extends SSSLSocketFactory {
    public CustomTLSSSLSocketFactory() {
    TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            factory.init((KeyStore) null);
            TrustManager[] defaultTrustManagers = factory.getTrustManagers();
    
            // create the real socket factory
            SSLContext sc = SSLContext.getInstance("TLS"); //$NON-NLS-1$
            sc.init(null, defaultTrustManagers, null);
            delegate = sc.getSocketFactory();
        }
    }
    

    【讨论】:

    • 如果您对问题有疑问,请使用 cmets。
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2020-11-01
    • 1970-01-01
    • 2012-05-17
    • 2020-07-05
    相关资源
    最近更新 更多