Tomcat 6和TLSv1.2在Java中的应用

10

我有一个Java应用程序部署在tomcat 6上。该应用程序通过套接字发送消息到另一个服务,它需要仅使用TLSv1.2协议。 在我的tomcat6.conf文件中,我放置了以下配置:

JAVA_HOME=/usr/lib/jvm/jre1.7.0_75
JAVA_OPTS="${JAVA_OPTS} -Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory -Dhttps.protocols=TLSv1.2"

但仍然使用旧版的TLS版本。

是否有任何配置可以在Java或Tomcat中应用以强制使用TLSv1.2?


编辑1: @Peter Walser提供的答案很好并且可能可行。问题是我无法修改代码,因为这是第三方提供的jar包,我只能配置环境而不能修改代码。


1
从安全角度来看:TLS限制(支持的协议和密码套件)应由服务器主导。客户端也可以应用限制(通过将协议和密码规范限制为可接受的安全集,即不再支持SSLv3和TLSv1.0),但应比服务器宽松。因此,您可以认为您期望从服务器限制到TLSv1.2(使您的TLSv1.2限制是可选的)。 - Peter Walser
1
如果您可以升级到Java 8或更高版本,则会自动执行TLS1.2(和1.1)。或者使用sysprop设置的7u95或没有--请参见http://www.oracle.com/technetwork/java/javase/documentation/javase7supportreleasenotes-1601161.html--但是,如果您正在使用Oracle Java,则7以上的版本u80需要支付“高级”支持费用。 Prob dupe https://stackoverflow.com/questions/50052456/。 - dave_thompson_085
@dave_thompson_085 谢谢,没错,但这里不是选项,他们不会升级到Java 1.8。也许可以尝试7u95...我可以试一下。 - developer_hatch
2个回答

3
如果您想强制服务器使用TLSv1.2,以下链接可能会提供所需的内容。
引用: Apache Tomcat 5.5 Servlet/JSP容器 - SSL配置HOW-TO
根据文档,按以下方式编辑Tomcat配置文件:
Tomcat使用的SSL实现会自动选择,除非按照以下说明进行覆盖。如果安装使用APR(即已安装了Tomcat本地库),则将使用APR SSL实现;否则,将使用Java JSSE实现。
为避免自动配置,可以通过在连接器的协议属性中指定类名来定义要使用的实现。要定义Java(JSSE)连接器,请执行以下操作,无论APR库是否已加载:
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" .../>

$CATALINA_BASE/conf/server.xml文件中配置连接器,其中$CATALINA_BASE表示Tomcat 6实例的基本目录。安装Tomcat时,附带的默认server.xml文件包含SSL连接器的示例<Connector>元素。对于JSSE,它应该看起来像这样:

<!--
<Connector 
   port="8443" maxThreads="200"
   scheme="https" secure="true" SSLEnabled="true"
   SSLCertificateFile="/usr/local/ssl/server.crt" 
   SSLCertificateKeyFile="/usr/local/ssl/server.pem"
   clientAuth="optional" SSLProtocol="TLSv1"/>
-->
请注意,默认情况下示例SSL连接器元素已被注释掉。你可以删除你想要使用的示例SSL连接器周围的注释标签,或者添加一个新的连接器元素。在任何情况下,你都需要根据你的需求和环境配置SSL连接器。

端口属性(默认值为8443)是Tomcat监听安全连接的TCP/IP端口号。你可以将其更改为任何你想要的端口号(例如https通信的默认端口443)。然而,在许多操作系统上,需要进行特殊设置(超出本文档的范围),才能在低于1024的端口号上运行Tomcat。

完成这些配置更改后,你必须像平常一样重新启动Tomcat,然后你应该可以通过SSL访问任何由Tomcat支持的Web应用程序。


尝试将<Connector>元素中的SSLProtocol属性更改为SSLProtocol="TLSv1.2"
<Connector 
   port="8443" maxThreads="200"
   scheme="https" secure="true" SSLEnabled="true"
   SSLCertificateFile="/usr/local/ssl/server.crt" 
   SSLCertificateKeyFile="/usr/local/ssl/server.pem"
   clientAuth="optional" SSLProtocol="TLSv1.2"/>

1
我会尝试并且很快告诉你。 - developer_hatch
1
这是针对客户端(浏览器等)到Tomcat的连接;它对应用程序的出站连接没有影响。 - dave_thompson_085

3

https.protocols 系统属性仅适用于 HttpsURLConnectionURL.openStream(),如 诊断 TLS、SSL 和 HTTPS 中所述。

控制 Java 客户端通过使用 HttpsURLConnection 类或通过 URL.openStream() 操作获取 https 连接时所使用的协议版本。...

对于非 HTTP 协议,可以通过 SocketFactory 的 SSLContext 进行控制。

您可以按以下方式配置 SSLSocket:

SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setEnabledProtocols(new String[] {"TLSv1.2"});

当使用REST客户端时,大多数支持通过SSLContext配置协议。例如(JAX-RS客户端):

Client client = ClientBuilder.newBuilder()
    .sslContext(SSLContext.getInstance("TLSv1.2"))
    // more settings, such as key/truststore, timeouts, logging
    .build();

非常感谢,它可能有效,但正如我的编辑所说,我不能触碰代码,无论如何感谢您的时间! - developer_hatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接