如何在多个 HTTPS 端口上运行 Spring Boot HTTPS 服务器
Posted
技术标签:
【中文标题】如何在多个 HTTPS 端口上运行 Spring Boot HTTPS 服务器【英文标题】:How to run Spring Boot HTTPS server on multiple HTTPS ports 【发布时间】:2021-03-01 10:49:28 【问题描述】:我需要使用 HTTPS 在 2 个或更多端口上运行同一服务器。在早期生产中,我们为服务配置了 10500 端口。目前,我们需要在启用 SSL 的 443 和 10500 上运行它。
我找到了许多资源来为 Spring Boot 启用 HTTP 和 HTTPS。但我找不到任何允许在 2 个或更多端口上启用 HTTPS 服务的方法。
我已尝试配置端口重定向。但这也没有用。它在使用 HTTP 手动连接到端口 443 时有效。但是每当使用 HTTPS 时,程序都会抛出异常。
java.lang.IllegalArgumentException异常:无效字符在方法名实测值[0x160x030x010x020x000x010x000x010xfc0x030x030x810x00aC0x1b0x10`0xb80x8d0xae0x9e0xe40xc7V0xf60x08:e0xcc0x8f
@Bean
public ServletWebServerFactory servletContainer()
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory()
@Override
protected void postProcessContext(Context context)
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
;
tomcat.addAdditionalTomcatConnectors(oldPortRedirectConnector());
return tomcat;
private Connector oldPortRedirectConnector()
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("https");
connector.setPort(443);
connector.setSecure(true);
connector.setRedirectPort(10500);
return connector;
application.properties
server.port=10500
非常感谢任何帮助。在 2 个端口上运行相同的服务或从一个 HTTPS 端口转发到另一个端口对我们来说真的很棒。
【问题讨论】:
看看这个***.com/questions/36357135/… 这能回答你的问题吗? Configure Spring Boot with two ports 感谢您的建议。但这些答案仅提供配置额外 HTTP 端口的选项。我想要额外的 HTTPS 端口。 【参考方案1】:最后,我得到了它的工作。问题是,即使我使用 HTTPS 方案添加了额外的连接器,也没有为该额外的连接器设置 SSL 配置。
通过设置 SSLHostConfig,我们可以拥有尽可能多的额外 https 端口。
@Bean
public ServletWebServerFactory servletContainer()
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory()
@Override
protected void postProcessContext(Context context)
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
;
tomcat.addAdditionalTomcatConnectors(extraHttpsConnector());
return tomcat;
private Connector extraHttpsConnector()
Connector connector = new Connector();
connector.setScheme("https");
connector.setPort(443);
connector.setSecure(true);
connector.setProperty("SSLEnabled", "true");
//Add SSL configuration to your extra connector
SSLHostConfig sslConfig = new SSLHostConfig();
SSLHostConfigCertificate certConfig = new SSLHostConfigCertificate(sslConfig, Type.RSA);
certConfig.setCertificateKeystoreFile("YOUR_KEYSTORE");
certConfig.setCertificateKeystorePassword("YOUR_KEYSTORE_PASSWORD");
certConfig.setCertificateKeyAlias("YOUR_KEYSTORE_ALIAS");
sslConfig.addCertificate(certConfig);
//Link the configuration to the connector
connector.addSslHostConfig(sslConfig);
return connector;
【讨论】:
以上是关于如何在多个 HTTPS 端口上运行 Spring Boot HTTPS 服务器的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口
如何在 STS/eclipse 的多个端口上启动单个 Spring Boot 微服务? [关闭]
面试官:如何在自定义端口上运行 Spring Boot 应用程序?