将HTTP重定向到HTTPS:Tomcat中的PORT

ABR*_*ABR 21 apache https tomcat web-applications server.xml

我有一个正在运行的tomcat应用程序,它已经具有从HTTP到HTTP的以下重定向规则:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />
Run Code Online (Sandbox Code Playgroud)

是否可以添加例外/规则,特定的HTTPrequest(http://www.example.com)将被重定向到指定端口的另一个特定地址(例如https://www.example.com: 8443/test),无需更换/拆卸上述连接器?

mal*_*una 19

您显示的连接器配置不会以您想象的方式重定向特定URL.

如果已CONFIDENTIAL为该servlet容器内的Web应用程序配置传输保证,则该配置将起作用.

我的意思是,如果您在该连接器上部署了任何应用程序,其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>
Run Code Online (Sandbox Code Playgroud)

然后,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"/>  
Run Code Online (Sandbox Code Playgroud)

这是一个示例配置,我没有将一些对您来说很重要的属性作为线程attrs,executor等等.

最重要的是您需要为HTTPS连接提供服务的KeyStore配置.在这里,您可以获得官方文档,以便为Tomcat准备用于提供HTTPS的Java KeyStore.


Mat*_*ari 17

您可以通过将其添加到以下结尾来对部署到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>
Run Code Online (Sandbox Code Playgroud)

因此,您不必在webapp的web.xml上更改它.

假设您已经在另一个端口(通常是443)中运行https,那应该可行.如果你不这样做,请确保你的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>
Run Code Online (Sandbox Code Playgroud)


Kon*_*nko 10

我有一个正在运行的tomcat应用程序,它已经具有从HTTP到HTTP的以下重定向规则:

正如malaguna所回答的那样,该Connector配置不是重定向规则.它只是在执行由重定向触发时使用的设置<transport-guarantee>CONFIDENTIAL</transport-guarantee>.

无法基于每个应用程序覆盖该设置.

如果您需要更好地控制此类重定向,则需要实现自己的Filter,它将实现重定向(if (!request.isSecure()) { response.sendRedirect(...);})或配置第三方.

//从技术上讲,在当前的Tomcat 8代码中,触发的重定向transport-guarantee是由org.apache.catalina.realm.RealmBase.hasUserDataPermission(...)方法执行的.