如何查找Java中使用的SSL/TLS版本

Guy*_*Guy 33 java ssl

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

我想知道使用的SSL版本是什么?是TLS1.0吗?TLS1.1?别的什么?

Bru*_*uno 30

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

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

  • @emstol [标准名称](http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#SSLContext)文档只是官方名称(基本上,它是提前计划的) ).Oracle的[SunJSSE提供商("正常"Oracle JRE附带的提供商)](http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SunJSSEProvider)没有不支持Oracle JRE 6中的TLS 1.1. (4认同)

isa*_*pir 16

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

SSLContext.getDefault().getSupportedSSLParameters().getProtocols()
Run Code Online (Sandbox Code Playgroud)

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

String.join(" ", SSLContext.getDefault().getSupportedSSLParameters().getProtocols())
Run Code Online (Sandbox Code Playgroud)

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

SSLv2Hello SSLv3 TLSv1 TLSv1.1 TLSv1.2

在 Windows 上的 Java 11 中:

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

  • 支持的协议 >= 启用的协议 >= 用于连接的实际协议。 (3认同)

小智 9

这将获取活动协议:

  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;
    }
  }
Run Code Online (Sandbox Code Playgroud)