Java中的Tomcat 6和TLSv1.2

Java中的Tomcat 6和TLSv1.2,java,tomcat,ssl,Java,Tomcat,Ssl,我在Tomcat6中部署了一个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

我在Tomcat6中部署了一个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,我只能配置环境,不能配置代码

如中所述,
https.protocols
系统属性仅适用于
HttpsURLConnection
URL.openStream()

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

对于非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客户端):


如果您试图强制服务器使用TLSv1.2,以下链接可能会提供您所需的内容


按照文档的规定,编辑Tomcat配置文件如下:

Tomcat使用的SSL的实现是自动选择的,除非它被如下所述覆盖。如果安装使用APR,即您已经安装了Tomcat本机库,那么它将使用APR SSL实现,否则将使用Java JSSE实现

为了避免自动配置,您可以通过在连接器的协议属性中指定类名来定义要使用的实现。 要定义Java(JSSE)连接器,无论是否加载APR库,请执行以下操作:

<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" .../>
您将注意到,默认情况下,示例SSL连接器元素被注释掉。您可以从要使用的示例SSL连接器周围删除注释标记,也可以添加自己的新连接器元素。在这两种情况下,您都需要根据自己的需求和环境配置SSL连接器

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

完成这些配置更改后,您必须像往常一样重新启动Tomcat,并且您应该可以开始工作了。您应该能够通过SSL访问Tomcat支持的任何web应用程序


尝试将
元素中的
SSLProtocol
属性更改为
SSLProtocol=“TLSv1.2”



非常感谢,它可以工作,正如我的编辑所说,我不能触摸代码,无论如何感谢您抽出时间!从安全角度来看:TLS限制(支持的协议和密码套件)应由服务器主导。客户端也可以应用限制(通过将协议和密码规范限制为可接受的安全集,即不再支持SSLv3和TLSv1.0),但应该比服务器更宽松。因此,您可能会争辩说,您希望从服务器获得对TLSv1.2的限制(使您的TLSv1.2限制成为可选的)。如果您可以升级到java 8或更高版本,那么TLS1.2(和1.1)将自动完成。或带有sysprop设置的7u95或不带sysprop设置的7u131--请参阅--但如果您使用的是Oracle Java,则高于u80的7版本需要您为“高级”支持付费。问题是重复。@dave_thompson_085谢谢,这是真的,但这里没有选择,他们不会升级到java 1.8。到了7u95。。。我可以试一试,我会试一试,我会让你知道这是从客户端(浏览器等)到Tomcat的连接;它对应用程序的传出连接没有影响。
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" .../>
<!--
<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"/>
-->
<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"/>