要求是客户端应支持以下用于TLS加密的密码套件:
private String[] cipherSuites = new String[] {
"TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA ",
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_256_CBC_SHA256",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA256",
};
这是主要代码:
public static void main(String []args) throws IOException {
Hashtable<String, String> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://10.159.218.169:636/ou=LDAPConfData,ou=Nokia,dc=solution,dc=com");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=username,ou=People,dc=solution,dc=com");
env.put(Context.SECURITY_CREDENTIALS, "123456");
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put("java.naming.ldap.factory.socket", CustomSocketFactory.class.getName());
try {
InitialDirContext context = new InitialDirContext(env);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
覆盖套接字工厂:
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
SSLSocketFactory sslFact = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) sslFact.createSocket(host, port);
sslSocket.setEnabledCipherSuites(cipherSuites);
return sslSocket;
}
运行主代码时,会发生异常: root异常是java.lang.IllegalArgumentException:无法支持当前安装的提供程序的TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
支持的密码套件大小为56,但只有四个需要密码。 是否有解决方案来解决这个问题?非常感谢。
答案 0 :(得分:3)
问题是由美国加密出口限制引起的。默认情况下,您不能使用密钥大小为256位的密码。
由于少数国家政府的进口管制限制,所运送的管辖区政策文件规定可以使用“强”但有限的加密。这些文件的“无限强度”版本表明对加密强度没有限制,适用于那些生活在符合条件的国家(大多数国家/地区)的人。但只有“强势”版本可以导入那些政府要求限制的国家。 JCE框架将强制执行已安装的管辖区策略文件中指定的限制。
要禁用这些限制,您需要
找到并更改为jre / lib / security目录
删除local_policy.jar和US_export_policy.jar
把JCE无限强度jar文件