Java套接字:如何知道我的SslSocket当前使用的TLS版本?

问题描述

我的客户拨打服务器。我们最近通过了一项安全策略,仅允许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上最有价值的问题,但对于希望做我想做的事情的人来说可能很有用...无论如何,现在,像我这样的凡人来决定问题的发生已经超出了我自己。还是谢谢你。