Перенаправление HTTP на HTTPS: PORT в Tomcat

У меня есть работающее приложение tomcat, которое уже имеет следующее правило перенаправления от HTTP к HTTP:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

Можно ли добавить правило исключения/правила, что конкретный HTTPrequest (http://www.example.com) будет перенаправлен на другой конкретный адрес, с указанным портом (скажем https://www.example.com:8443/test), не изменяя/не удаляя вышеупомянутый Коннектор?

Ответ 1

Отображаемая конфигурация соединителя не перенаправляет определенный URL так, как вы предполагаете.

Эта конфигурация действует, если вы настроили транспортную гарантию CONFIDENTIAL для веб-приложения внутри контейнера сервлетов.

Я имею в виду, если вы развернули какое-либо приложение на этом соединителе, где его дескриптор web.xml имеет security-constraint следующим образом:

<security-constraint>

    <web-resource-collection>
        <web-resource-name>Secured</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>

    ...

    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>

</security-constraint>

Затем Tomcat перенаправит любой соответствующий url-pattern на сконфигурированный порт, чтобы использовать HTTPS в качестве гаранта конфиденциальности в транспорте.

Итак, если вы хотите перенаправить определенный URL-адрес, вам необходимо дополнить конфигурацию соединителя конкретной конфигурацией приложения.

Изменить

Как вы предлагаете в своем комментарии, это может быть еще одним шагом для работы этой конфигурации. После того, как вы настроили http-коннектор, как показано, а затем настроенное приложение, как я сказал вам, вы должны убедиться, что на вашем сервере Tomcat установлен коннектор HTTPS, перенаправление другого пути не будет работать.

Для настройки этого HTTPS-коннектора вы можете использовать следующую конфигурацию:

<Connector connectionTimeout="20000"
    acceptCount="100" scheme="https" secure="true"
    port="443" clientAuth="false" sslProtocol="TLS"  
    keystoreFile="PATH_TO_KEY_STORE"  
    keystorePass="KEY_STORE_PASS"  
    keyAlias="KEY_STORE_ALIAS"/>  

Это пример конфигурации, в которой я не помещал некоторые атрибуты, которые могут быть важны для вас как потоки attrs, исполнители и т.д.

Самое главное - это конфигурация KeyStore, необходимая для обслуживания HTTPS-соединений. Здесь у вас есть официальная документация для подготовки Java-KeyStore для Tomcat для обслуживания HTTPS.

Ответ 2

У меня есть работающее приложение tomcat, которое уже имеет следующее правило перенаправления от HTTP к HTTP:

Как ответил малагуна, конфигурация Connector не является правилом перенаправления. Это просто параметр, который используется при выполнении перенаправления, вызванного <transport-guarantee>CONFIDENTIAL</transport-guarantee>.

Невозможно перезаписать этот параметр для каждого приложения.

Если вам нужно лучше контролировать такое перенаправление, вам необходимо реализовать собственный фильтр, который будет реализовывать перенаправление (if (!request.isSecure()) { response.sendRedirect(...);}) или настроить сторонний вариант.

//Технически, в текущем коде Tomcat 8 перенаправление, инициированное transport-guarantee, выполняется методом org.apache.catalina.realm.RealmBase.hasUserDataPermission(...).

Ответ 3

Вы можете сделать это для каждого приложения, развернутого в tomcat, добавив это в конец tomcat_dir/conf/web.xml:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Entire Application</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <!-- auth-constraint goes here if you requre authentication -->
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Таким образом, вам не нужно менять его на web.xml вашего webapp.

Это должно работать, , если у вас уже есть https, работающий в другом порту (обычно 443). Если вы этого не сделаете, убедитесь, что ваш tomcat_dir/conf/server.xml выглядит следующим образом:

<!-- Default tomcat connector, changed the redirectPortport from 8443 to 443 -->
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

<!-- To make https work on port 443 -->
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        maxThreads="150" SSLEnabled="true">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
    <SSLHostConfig>
        <Certificate certificateKeyFile="/your/own/privkey.pem"
            certificateFile="/eyour/own/cert.pem"
            certificateChainFile="/your/own/chain.pem"
            type="RSA" />
    </SSLHostConfig>
</Connector>

Ответ 4

Если вы используете tomcat с httpd, вы можете использовать RewriteEngine.

С указанным портом, как указано в http.conf:

NameVirtualHost *:8443 #your specified port
<VirtualHost *:8443>
   ServerName www.example.com
   Redirect permanent / https://secure.example.com/
</VirtualHost>

Смотрите: RewriteHTTPToHTTPS и Запрос перенаправления на SSL

Ответ 5

        <Connector connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="443"/>

        <Connector port="443" 
               SSLEnabled="true" 
               acceptCount="100" 
               disableUploadTimeout="true" 
               enableLookups="false" 
               maxHttpHeaderSize="8192" 
               maxThreads="550" 
               minSpareThreads="25"  
               scheme="https" 
               secure="true" 
               compression="on"
               protocol="org.apache.coyote.http11.Http11NioProtocol" 
               sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation">
                   <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/> 
                   <SSLHostConfig protocols="TLSv1.2" 
                                  certificateVerification="none" 
                                  ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA">
                                        <Certificate type="RSA" 
                                                     certificateKeystoreFile="/ssl/self-signed/your-keystore.jks" 
                                                     certificateKeystorePassword="123456" 
                                                     certificateKeyAlias="your-alias" /> 
                    </SSLHostConfig>
        </Connector>

Ответ 6

Поместить CONFIDENTIAL с гарантией транспорта в conf/web.xml - это хорошо, но оно не распространяется на приложение менеджера и приложение хост-менеджера (Tomcat 8.5.38).

Мое решение состоит в том, чтобы поместить в файл conf/context.xml клапан, который перенаправляет все http-запросы на https.

https://bitbucket.org/bunkenburg/https-valve/src/master/