如何在Spring引导嵌入式tomcat中设置HTTPS SSL Cipher Suite首选项

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

我想让服务器选择具有“TLS_ECDHE …”的服务器和客户端之间的通用,以便支持Forward Secrecy。 现在我在“www.ssllabs.com”中测试过,客户端浏览器会更喜欢使用“TLS_RSA …”而非“TLS_ECDHE”的密码…

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

我假设Spring启动嵌入式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 

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

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

 @Bean public EmbeddedServletContainerCustomizer servletContainerCustomizer() { return (factory) -> { ((TomcatEmbeddedServletContainerFactory) factory) .addConnectorCustomizers((connector) -> { ((AbstractHttp11Protocol) connector.getProtocolHandler()) .setUseServerCipherSuitesOrder(Boolean.toString(true)); }); }; }