29

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

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

是否可以添加一个例外/规则,即特定的 HTTP 请求(http://www.example.com)将被重定向到另一个特定的地址,并指定一个端口(比如https://www.example.com: 8443/test ),无需更改/移除上述连接器?

4

7 回答 7

29

您显示的连接器配置不会以您想象的方式重定向特定 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>

然后,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、executors 等放置。

最重要的是提供 HTTPS 连接所需的 KeyStore 配置。这里有官方文档,可以为 Tomcat 准备一个 java KeyStore 来服务 HTTPS。

于 2015-10-22T05:43:13.310 回答
26

您可以通过将其添加到末尾来对部署到 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>

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

假设您已经有 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>
于 2017-07-04T21:55:43.443 回答
13

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

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

无法在每个应用程序的基础上覆盖该设置。

如果您需要更好地控制此类重定向,则需要实现自己的过滤器来实现重定向 ( if (!request.isSecure()) { response.sendRedirect(...);}),或者配置一个3rd party one

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

于 2015-10-25T03:46:55.137 回答
4

如果你使用带有 httpd 的 tomcat,你可以使用RewriteEngine.

在 http.conf 中指定端口如下:

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

请参阅:RewriteHTTPToHTTPS重定向请求到 SSL

于 2015-10-28T12:28:29.277 回答
1

将 transport-guarantee CONFIDENTIAL 放在 conf/web.xml 中很好,但它不包括管理器应用程序和主机管理器应用程序(Tomcat 8.5.38)。

我的解决方案是在 conf/context.xml 中放置一个阀门,将所有 http 请求重定向到 https。

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

于 2019-03-27T16:34:30.017 回答
-1

现在回答已经太晚了,我仍然在分享我的经验,做以下更改

Apache Software Foundation\Tomcat 8.5\conf\web.xml

重新启动。

Pre-Req:配置 https 端口并禁用 http 端口(可选[我做到了])

在此处输入图像描述

于 2021-06-18T08:28:42.377 回答
-2
        <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>
于 2018-02-18T07:29:48.480 回答