我们目前正在更改其中一台服务器上的端口,但客户端在实时操作中可能不会受到限制。 以前使用的端口是 8443,允许客户端访问服务器。 新的应该是 443。 于是我开始在Spring中配置Tomcat支持多端口。
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors != null && additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
private Connector[] additionalConnector() {
if (StringUtils.isBlank(this.additionalPorts) || this.additionalPorts.equalsIgnoreCase("none")) {
return null;
}
String[] ports = this.additionalPorts.split(",");
List<Connector> result = new ArrayList<>();
for (String port : ports) {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("https");
connector.setPort(Integer.valueOf(port));
connector.setSecure(true);
result.add(connector);
}
return result.toArray(new Connector[] {});
}
应用程序属性:
server.port=443
server.additionalPorts=8443
security.require-ssl=true
server.ssl.key-store=/var/back/keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=tomcat
server.ssl.key-store-password=<pw hidden>
现在的问题是服务器开始正确监听两个端口:
Tomcat started on port(s): 443 (https) 8443 (https) with context path ''
但只有 443 端口在工作。我猜只有 443 使用了梯形校正。如何才能使端口 8443 也使用相同的 keystore ?
最佳答案
好吧,经过更多研究并浏览一些类文件和 javadoc 之后,我使用以下代码扩展解决了这个问题。
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
//Getting the Protocol from the connector
Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();
connector.setPort(Integer.valueOf(port));
protocol.setSSLEnabled(true); //Set SSL Enabled
connector.setScheme("https");
connector.setSecure(true);
//And now setting all properties in the protocol which would be set in the application.properties
File truststore = Paths.get(keyStore).toFile();
protocol.setKeystoreFile(truststore.getAbsolutePath());
protocol.setKeystoreType(keyStoreType);
protocol.setKeyAlias(keyAlias);
protocol.setKeystorePass(keyPassword);
关于java - Spring Tomcat 多个 HTTPS 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62064367/