限制SSLContext中的协议

时间:2013-11-20 10:06:21

标签: java tomcat ssl https httpclient

我有一个通过tomcat使用SSLv3协议的java服务器。

我正在创建一个只使用SSLv3进行通信的Java客户端。另外我使用Apache Http客户端进行我的http通信。以下是我正在使用的客户端代码的片段,

DefaultHttpClient httpClient = new DefaultHttpClient();
SSLContext ctx = SSLContext.getInstance("SSLv3");
TrustManager[] trustManagers = getTrustManagers("jks", new FileInputStream(new File("C:\\SSLKeyStore.ks")), "changeit");
ctx.init(null, trustManagers, new SecureRandom());
System.out.println("Context Protocol - " + ctx.getProtocol());

SSLSocketFactory factory = new SSLSocketFactory(ctx);
factory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

ClientConnectionManager manager = httpClient.getConnectionManager();
manager.getSchemeRegistry().register(new Scheme("https", 443, factory));

HttpGet httpget = new HttpGet("https://localhost:8844/getData");

System.out.println("executing request" + httpget.getRequestLine());

HttpResponse response = httpClient.execute(httpget);

问题是当我启用“javax.net.debug=ssl'时,在我看到的日志中,我的客户端正在谈论TLSv1,而我的服务器正在通过SSLv3进行正确通信。下面是日志的样子,

*** ClientHello, TLSv1
***
main, WRITE: TLSv1 Handshake, length = 149
main, READ: SSLv3 Handshake, length = 1353
*** ServerHello, SSLv3

当我打印支持的协议时,我看到“SSLv3,TLSv1”,因此我猜客户端正在显示更高版本的协议。

但问题是如何限制客户端仅使用“SSLv3”。我也尝试过设置https.protocols="SSLv3"。但这也没有帮助。

寻找可能有帮助的任何解决方案/提示。

提前致谢。

维基

1 个答案:

答案 0 :(得分:0)

找到了解决方案。

如果我将SSLSocketFactory并覆盖createSocket方法继承为"setEnabledProtocols"'SSLv3'。然后,通信完全按照给定,即客户端和服务器都使用SSLv3进行通信。

以下是调试交换,

*** ClientHello, SSLv3
***
main, WRITE: SSLv3 Handshake, length = 149
main, READ: SSLv3 Handshake, length = 1353
*** ServerHello, SSLv3

然而,我对任何其他方法持开放态度,这些方法更为微妙。