如何在多个 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 Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

如何在 STS/eclipse 的多个端口上启动单个 Spring Boot 微服务? [关闭]

面试官:如何在自定义端口上运行 Spring Boot 应用程序?

如何使用 Restify 在同一个端口上运行多个 Node 应用程序?

如何使用 Restify 在同一个端口上运行多个 Node 应用程序?