如何在Spring Boot嵌入式tomcat中设置HTTPS SSL密码套件首选项

Lee*_*Hoe 4 java ssl spring tomcat spring-boot

我尝试根据服务器首选项设置HTTPS SSL密码套件首选项,而不是基于具有最高强度的客户端和服务器支持的通用密码套件自动选择。

我想让服务器选择具有“ TLS_ECDHE ...”的服务器和客户端之间的公用,以支持转发保密。现在,我在“ www.ssllabs.com”中进行了测试,客户端浏览器将更喜欢具有“ TLS_RSA ...”的密码,而不是“ TLS_ECDHE” ...

我注意到Java 8支持设置密码套件首选项:http : //docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#cipher_suite_preference

我假设Spring Boot嵌入式Tomcat将调用Java 8函数来选择密码

这是我在spring boot application.properties文件中所做的设置服务器支持密码集的操作:

server.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_SHA,TLS_ECDHE_RSA_WITH_AES_256_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_SHA384,TLS_ECDHE_RSA_WITH_AES_256_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_128_SHA,TLS_DHE_DSS_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_256_SHA256,TLS_DHE_DSS_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_256_SHA
Run Code Online (Sandbox Code Playgroud)

希望有人可以指导我如何覆盖默认的选择密码行为。

And*_*son 6

您需要告诉连接器的基础协议处理程序使用服务器的密码套件顺序。您可以使用EmbeddedServletContainerCustomizer

@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
    return (factory) -> {
        ((TomcatEmbeddedServletContainerFactory) factory)
                .addConnectorCustomizers((connector) -> {
            ((AbstractHttp11Protocol<?>) connector.getProtocolHandler())
                    .setUseServerCipherSuitesOrder(Boolean.toString(true));
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

  • 要将这个解决方案升级到 Spring Boot 2.1.x,我只需要做两个小改动:用`WebServerFactoryCustomizer&lt;TomcatServletWebServerFactory&gt;`替换`EmbeddedServletContainerCustomizer`,用`TomcatServletWebServerFactory`替换`TomcatEmbeddedServletContainerFactory`。 (2认同)
  • 另外,在 Spring Boot 2.0.7 和 2.1.3 之间,`setUseServerCipherSuitesOrder` 的参数从 String 更改为 boolean。 (2认同)