如何使用spring boot和嵌入式tomcat禁用TLSv1.0?

时间:2016-07-11 08:47:10

标签: java spring spring-mvc tomcat

我想用spring boot(版本1.3.3)取消激活TLSv1.0,但是如果application.yml如下所示它不起作用:

ssl: protocol: TLSv1.2 key-store: /E:/key/server.jks key-store-password: serverpkcs12

如果只在IE中选择“USE TLS 1.0”,我仍然可以访问网页。 See this pic--not work.

但是,如果不使用嵌入式tomcat,并为位于server.xml中的Connector添加这些参数,它对我来说很好 - IE阻止的网页。 See this pic--worked for me

sslProtocols="TLSv1.2" sslEnabledProtocols="TLSv1.2"

我还尝试了一些虚拟机参数,例如 -Dhttps.protocols =“TLSv1.2”,所有这些都是无用的。

那我能为此做些什么呢?

4 个答案:

答案 0 :(得分:4)

我发现的一种方法是设置仅由TLSv1.2支持的密码。例如:如果你将放入application.yml

server.ssl.ciphers:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

使用CURL

  

openssl s_client -connect example.com:443 -tls1

您将看到该请求将被忽略/拒绝,因为您在application.yml中设置的密码将仅验证TLSv1.2请求。

答案 1 :(得分:3)

最透明和可读的方法是通过排除 - 当然 - 不需要的TLS协议,在应用程序配置文件中显式配置有效的TLS协议。

e.g。在YAML

server.ssl.enabled-protocols=TLSv1.1,TLSv1.2

然后,您可以启动服务器,并通过执行以下操作检查TLSv1.0是否正常工作

openssl s_client -connect localhost:443 -tls1

上述连接应被拒绝,而以下两个连接将被接受并打印证书的详细信息

openssl s_client -connect localhost:443 -tls1_1
openssl s_client -connect localhost:443 -tls1_2

答案 2 :(得分:1)

我的解决方案是

@Bean
public EmbeddedServletContainerFactory servletContainerFactory()
{
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

    factory.addConnectorCustomizers(new TomcatConnectorCustomizer()
    {
        @Override
        public void customize(Connector connector)
        {
            connector.setAttribute("sslProtocols", "TLSv1.1,TLSv1.2");
            connector.setAttribute("sslEnabledProtocols", "TLSv1.1,TLSv1.2");
        }
    });

    return factory;
}

从application.yml

中删除协议:TLSv1.2

答案 3 :(得分:0)

到目前为止,答案仅显示了如何将TLS锁定到尚未被破坏的一组版本。由于问题是如何停用特定版本,因此至少使用Java 8:

  String algs = Security.getProperty("jdk.tls.disabledAlgorithms");

  // TODO: null/empty check on algs

  Set<String> disabled =
      Arrays.stream(algs.split(","))
          .map(String::trim)
          .collect(Collectors.toSet());

  // TODO: inject these algs as properties for configurability

  disabled.add("TLSv1");

  algs = String.join(", ", disabled);
  Security.setProperty("jdk.tls.disabledAlgorithms", algs);

在创建Tomcat服务器之前,请在上下文初始化之前尽早进行此操作,为彻底起见,您应该抓住SecurityException,以防万一有阻止setProperty()调用的策略。

使用此方法,您将来会受益于JDK中包含的新版本。