【问题标题】:Spring Tomcat Multiple HTTPS PortsSpring Tomcat 多个 HTTPS 端口
【发布时间】:2020-09-15 17:58:00
【问题描述】:

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

application.properties:

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 在端口上启动:443 (https) 8443 (https) 和上下文路径 ''

但只有 443 端口在工作。我猜只有 443 使用了梯形失真。如何实现端口 8443 也使用相同的密钥库?

【问题讨论】:

标签: java spring tomcat


【解决方案1】:

好的,经过一些研究和浏览一些类文件和 javadocs,我通过以下代码扩展解决了这个问题。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2021-03-01
    • 1970-01-01
    • 2012-09-06
    • 2011-09-19
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多