问题描述
我的客户拨打服务器。我们最近通过了一项安全策略,仅允许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 ...,但是未提供有关如何执行此操作的示例我自己找不到解决方案
解决方法
啊,我的问题是因为在此类之上,我将套接字用作通用对象,它可以是纯文本或SSL ...因此,当我尝试执行socket.getSession时-我看不到该方法。 ..
到目前为止,我正在这样做:
public String getTls () {
SSLSocket temporaryReference = (SSLSocket) socket;
SSLSession sslSession = temporaryReference.getSession();
return sslSession.getProtocol();
}
我得到了:
TLSv1.2
现在,我可以做简单的事情了:)
我意识到这可能不是SO上最有价值的问题,但对于希望做我想做的事情的人来说可能很有用...无论如何,现在,像我这样的凡人来决定问题的发生已经超出了我自己。还是谢谢你。