【发布时间】:2012-05-17 01:10:14
【问题描述】:
我有一个基于 java 的客户端(使用 java 1.6.30),它打开到部署在 Tomcat 7.0.26 上的服务器的 SSL 连接。 Tomcat 使用 Java 6,在 server.xml 中我将连接器配置为使用 sslProtocol="TLS"。
我想知道所使用的 SSL 版本是什么?是 TLS1.0 吗? TLS1.1?还有什么?
【问题讨论】:
我有一个基于 java 的客户端(使用 java 1.6.30),它打开到部署在 Tomcat 7.0.26 上的服务器的 SSL 连接。 Tomcat 使用 Java 6,在 server.xml 中我将连接器配置为使用 sslProtocol="TLS"。
我想知道所使用的 SSL 版本是什么?是 TLS1.0 吗? TLS1.1?还有什么?
【问题讨论】:
这将获取活动协议:
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;
}
}
【讨论】:
对于 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 "%r" %s %b" %{org.apache.tomcat.util.net.secure_protocol_version}r />
【讨论】:
您可以使用以下 sn-p 来获取支持的协议数组:
SSLContext.getDefault().getSupportedSSLParameters().getProtocols()
如果你想要它作为一个空格分隔的字符串,例如对于 SMTP 协商,将数组传递给 String.join(),即:
String.join(" ", SSLContext.getDefault().getSupportedSSLParameters().getProtocols())
后者 sn-p 在 Windows 上的 Java 8 中显示:
SSLv2Hello SSLv3 TLSv1 TLSv1.1 TLSv1.2
在 Windows 上的 Java 11 中:
TLSv1.3 TLSv1.2 TLSv1.1 TLSv1 SSLv3 SSLv2Hello
【讨论】:
从您的客户端上的SSLSocket 获取SSLSession 并使用其getProtocol() 方法。
Oracle JRE/OpenJDK 6 supports SSLv3 and TLS 1.0。您至少需要IBM JRE 6/7 或Oracle JRE/OpenJDK 7 to get support for TLS 1.1 and TLS 1.2。 (这也与可用的密码套件有关,如this question 中所述。)
【讨论】: