首页 > 解决方案 > Java 中的 Tomcat 6 和 TLSv1.2

问题描述

我在 tomcat 6 中部署了一个 Java 应用程序。该应用程序通过套接字将消息发送到另一个服务,并且它只需要使用 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"

但 stll 使用较旧的 tls 版本。

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


编辑 1: @Peter Walser 提供的答案很好,可以工作。问题是我不能修改代码,因为是第三方提供的jar,我只能配置环境,不能配置代码。

标签: javatomcatssl

解决方案


系统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();

推荐阅读