gpt4 book ai didi

java - 限制 SSLContext 中的协议(protocol)

转载 作者:行者123 更新时间:2023-11-28 23:40:38 25 4
gpt4 key购买 nike

我有一个通过 tomcat 使用 SSLv3 协议(protocol)的 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

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

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

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

提前致谢。

维琪

最佳答案

找到了解决方案。

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

下面是调试交换,

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

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

关于java - 限制 SSLContext 中的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20092842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com