Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制SSLContext中的protcol_Java_Tomcat_Ssl_Https_Httpclient - Fatal编程技术网

Java 限制SSLContext中的protcol

Java 限制SSLContext中的protcol,java,tomcat,ssl,https,httpclient,Java,Tomcat,Ssl,Https,Httpclient,我有一个通过tomcat使用SSLv3协议的java服务器 我正在创建一个java客户端,它将只使用SSLv3进行通信。此外,我正在使用Apache Http客户端进行Http通信。下面是我正在使用的客户机代码片段 DefaultHttpClient httpClient = new DefaultHttpClient(); SSLContext ctx = SSLContext.getInstance("SSLv3"); TrustManager[] trustManagers = getTr

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

我正在创建一个java客户端,它将只使用SSLv3进行通信。此外,我正在使用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”。但这也没有帮助

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

提前谢谢


Vicky找到了解决办法

如果我将
SSLSocketFactory
子类化,并将
createSocket
方法重写为
“setEnabledProtocols”
“SSLv3”
。然后通信完全按照给定的方式进行,即客户端和服务器都使用
SSLv3
进行通信

下面是调试交换

*** ClientHello, SSLv3
***
main, WRITE: SSLv3 Handshake, length = 149
main, READ: SSLv3 Handshake, length = 1353
*** ServerHello, SSLv3
然而,我愿意接受任何其他更微妙的方法