【发布时间】:2020-12-02 11:58:38
【问题描述】:
我的客户拨打服务器。我们最近采用了一项安全策略,只允许 TLS 1.2 连接,但我们对过渡很软弱:如果服务器和客户端无法就 TLS 1.2 套接字达成一致,那么会发出一些警告以解决此问题,但连接应该照常进行。
所以,我并不是真的在寻找一种方法来强制我的客户端只创建 TLS 1.2 连接,而是一种知道当前使用哪个连接的方法。
我的问题是关于如何从实时套接字中获取该信息。
这是我的客户端创建套接字的方式:
public static SSLSocket getSSLsocket (String hostFQDN, int port, String ksFullPath, String ksPassword, String pkPassword) {
try {
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);
//TODO: We are going to need a truststore definition... Meanwhile: System.setProperty("javax.net.ssl.trustStore", "src/resources/certificates/epp/cacertsuk");
SSLSocketFactory sslScktFactory = context.getSocketFactory();
return (SSLSocket) sslScktFactory.createSocket(hostFQDN, port);
} catch (Exception e) {
throw new RuntimeException("Could not create SSL socket", e);
}
}
我知道这个问题:How to find what SSL/TLS version is used in Java,其中主要答案似乎是说我可以从 SSLSocket 获取 SSLSession,然后调用 .getProtocol... 但是没有提供有关如何执行此操作的示例,我自己找不到解决方案
【问题讨论】:
-
嗯...作为答案,该问题引用了我提到的同一问题。缺少代码。虽然,我必须承认这并不是缺少很多代码:)