java - Spring Tomcat 多个 HTTPS 端口

标签 java spring tomcat

我们目前正在更改其中一台服务器上的端口,但客户端在实时操作中可能不会受到限制。 以前使用的端口是 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/

相关文章:

jsp - 如何从网络上的另一台计算机浏览我的 Tomcat 本地主机?

java - Android facebook登录后获取用户信息

java - 使用 JGraphXAdapter 改变边的颜色

java - 如何使用规范在mysql查询中使用多个 "OR"条件创建两个 "AND"条件

spring - 如何自定义 Spring Batch DelimitedLineTokenizer

tomcat - 在 JBoss 5.1 中使用其他 HTTP 连接器

java - 如何删除子域中的非法字符?

java - 接受多种http方法?

java - Spring Controller 处理程序方法中未注释参数的目的是什么?

oracle - HTP.P 不再在应用程序中工作