如何解决Java:如何为安全套接字选择特定版本的TLS?
我想查看网络上的哪些服务器将接受TLSv1.1或TLSv1.0(并对其进行处理)。但是,我不清楚如何在客户端中专门选择TLS版本。这是我创建安全套接字的方法:
SSLContext context = SSLContext.getInstance("TLS");
KeyManagerFactory keyMngFactory = KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream(ksFullPath),ksPassword.toCharArray());
keyMngFactory.init(keyStore,pkPassword.toCharArray());
context.init(keyMngFactory.getKeyManagers(),null,null);
SSLSocketFactory sslScktFactory = context.getSocketFactory();
return (SSLSocket) sslScktFactory.createSocket(hostFQDN,port);
显然,所有服务器都具有TLSv1.2,而我的客户端也具有TLSv1.2,因此他们同意最高可用版本,这是我们目前满意的版本...但不能保证其中有某些服务器没有启用1.1,并且其他一些客户端可以创建这样的连接!
- 我也在网上找到了该资源:Some IBM Doc,但不确定是否适用于我的Java(11)...此外,它是通过 整个环境的配置,我希望能解决 以编程方式,针对每个连接对象。
- 更新:我注意到我可以在第一个方法调用中替换参数,如下所示:
SSLContext context = SSLContext.getInstance("TLSv1.2"); // and this creates connections
我只是想知道在那里可以输入哪些可用参数,以及它们是否是“允许的最低版本”的规范,或者如果我要求TLSv1.2,是否仍不能保证获得TLSv1.2?混乱来自:
JSSE Reference Guide,in the SSLContext section:
返回的实例也可以实现其他协议。例如,getInstance(“ TLSv1”)可能会返回一个实现“ TLSv1”,“ TLSv1.1”和“ TLSv1.2”的实例
- 也意识到了
sslSocket.setEnabledProtocols();
,但这是相反的做法,需要我在连接尝试之间循环进行不同的设置,以便准确了解服务器的“打开状态”(“哪个版本”会接受”还是“会接受1.2以外的任何东西”)
基本上是在寻求另一种意见,以便更加确信SSLContext.getInstance("___")
排除的版本低于指定的版本,或者不是强制执行最安全版本的好方法...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。