Spring Tomcat Несколько портов HTTPS - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время мы находимся в процессе изменения порта на одном из наших серверов, но клиенты не могут быть ограничены в работе в реальном времени. Ранее использовался порт 8443, который позволял клиентам подключаться к серверу. Новый должен быть 443. Итак, я начал настраивать Tomcat в Spring для поддержки нескольких портов.

@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 запущен на порту ( s): 443 (https) 8443 (https) с контекстным путем ''

, но работает только порт 443. Я предполагаю, что только 443 использует трапецеидальный камень. Как я могу добиться того, чтобы порт 8443 также использовал то же хранилище ключей?

1 Ответ

0 голосов
/ 28 мая 2020

Хорошо, после небольшого дополнительного исследования и просмотра некоторых файлов классов и 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...