48

我有一个基于 java 的客户端(使用 java 1.6.30),它打开与部署在 Tomcat 7.0.26 上的服务器的 SSL 连接。Tomcat 使用的是 Java 6,并且在 server.xml 中我配置了要使用的连接器sslProtocol="TLS"

我想知道正在使用的 SSL 版本是什么?是 TLS1.0 吗?TLS1.1?还有什么?

4

4 回答 4

35

SSLSession从您的客户端获取SSLSocket并使用它的getProtocol()方法。

Oracle JRE/OpenJDK 6 支持 SSLv3 和 TLS 1.0。您至少需要IBM JRE 6/7Oracle JRE/OpenJDK 7 才能获得对 TLS 1.1 和 TLS 1.2 的支持。(这也与可用的密码套件有关,如本问题所述。)

于 2012-05-08T14:31:46.040 回答
17

您可以使用以下代码段获取支持的协议数组:

SSLContext.getDefault().getSupportedSSLParameters().getProtocols()

如果您希望它作为空格分隔的字符串,例如用于 SMTP 协商,请将数组传递给 String.join(),即:

String.join(" ", SSLContext.getDefault().getSupportedSSLParameters().getProtocols())

后一个片段显示在 Windows 上的 Java 8 中:

SSLv2Hello SSLv3 TLSv1 TLSv1.1 TLSv1.2

在 Windows 上的 Java 11 中:

TLSv1.3 TLSv1.2 TLSv1.1 TLSv1 SSLv3 SSLv2Hello

于 2019-08-23T23:50:05.007 回答
3

对于 tomcat 8.5.38 和 8.5.46(可能还有 tomcat 7.0x 和更新版本)将其添加到 AccessLogValve 模式(在 server.xml 中) - 并启用该 Valve - 将显示正在使用的 TLS 版本:

%{org.apache.tomcat.util.net.secure_protocol_version}r

eg
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" %{org.apache.tomcat.util.net.secure_protocol_version}r />
于 2019-10-05T02:58:33.963 回答
3

这将获得活动协议:

  private static String getActiveProtocols() {
    try {
      return Arrays.toString(SSLContext.getDefault().createSSLEngine().getEnabledProtocols());
    } catch (Exception e) {
      StringWriter stringWriter = new StringWriter();
      e.printStackTrace(new PrintWriter(stringWriter));
      return "Unable to get enabled protocols: " + e.getMessage() + LINE_SEPARATOR + stringWriter;
    }
  }
于 2021-05-28T22:48:13.137 回答