运行带有 SSL 和同时未加密的 Spring Boot 应用程序(嵌入式 Tomcat)

Posted

技术标签:

【中文标题】运行带有 SSL 和同时未加密的 Spring Boot 应用程序(嵌入式 Tomcat)【英文标题】:Running A Spring Boot App (Embedded Tomcat) with SSL and Unencrypted Simultaneously 【发布时间】:2014-12-24 10:48:51 【问题描述】:

有没有办法运行 Spring Boot 应用程序(可运行的战争),以便它监听两个端口 - 一个使用 SSL,一个没有 SSL。我使用的是嵌入式 Tomcat 8。

目前正在使用 SSL 配置

@Bean
@Profile('tls')
EmbeddedServletContainerCustomizer servletContainerCustomizer ()
throws Exception 

    new EmbeddedServletContainerCustomizer () 
        @Override
        public void customize (ConfigurableEmbeddedServletContainer container) 
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container
            tomcat.addConnectorCustomizers (
                    new TomcatConnectorCustomizer () 
                        @Override
                        public void customize (Connector connector) 
                            connector.setPort     (Integer.parseInt (retrieveRequiredSpringProperty ('ssl.connection.port')))
                            connector.setSecure   (true)
                            connector.setScheme   ('https')
                            connector.setProtocol (retrieveSpringPropertyOrSpecified ('ssl.connection.protocol', 'HTTP/1.1'))

                            Http11NioProtocol proto = (Http11NioProtocol) connector.getProtocolHandler ()
                            proto.setSSLEnabled   (true)
                            proto.setKeystoreFile (retrieveRequiredSpringProperty ('ssl.protocol.keystore.file'))
                            proto.setKeystorePass (retrieveRequiredSpringProperty ('ssl.protocol.keystore.password'))
                            proto.setKeyPass      (retrieveSpringPropertyOrSpecified ('ssl.protocol.keystore.cert.password', null))
                            proto.setKeystoreType ('JKS')
                            proto.setKeyAlias     (retrieveRequiredSpringProperty ('ssl.protocol.keystore.cert.name'))
                            proto.setSslProtocol  ('TLS')
                            proto.setClientAuth   ('false')
                        
                    
            )
        
    

我尝试使用多个TomcatConnectorCustomizers,但列出的最后一个似乎覆盖而不是添加。

一如既往地欢迎任何建议!

【问题讨论】:

【参考方案1】:

TomcatConnectorCustomizer 仅修改现有的Connector(名称中的线索)。要添加其他连接器,您只需要一个不同的 API(例如 here),例如(从样本中复制):

@Bean
public EmbeddedServletContainerFactory servletContainer() 
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    tomcat.addAdditionalTomcatConnectors(createConnector());
    return tomcat;

【讨论】:

以上是关于运行带有 SSL 和同时未加密的 Spring Boot 应用程序(嵌入式 Tomcat)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 应用程序在启动时未运行 Flyway 迁移

在带有 spring-boot rest 和 Swagger 的标头中使用 utf-8 字符时未加载响应

使用 Hibernate、Spring 和 JDBC 配置 SSL 证书

带有 SSL 加密的 Mosquitto 代理,用于桥接连接

小菜鸟学习SPRING BOOT -- ssl配置

如何使用带有 SSL 的 Spring WebSocketClient?