Перенаправление 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/