web-dev-qa-db-ja.com

TomcatでHTTPをHTTPS:PORTにリダイレクトする

HTTPからHTTPへの次のリダイレクトルールを既に持っている実行中のTomcatアプリケーションがあります。

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

特定のHTTPリクエスト( http://www.example.com )が、ポートを指定して別の特定のアドレスにリダイレクトされるという例外/ルールを追加することは可能ですか(たとえば https://www.example.com:8443/test )、上記のコネクタを変更/削除せずに?

18
ABR

示したコネクタ構成は、特定のURLを想定した方法でリダイレクトしません。

その構成は、そのサーブレットコンテナ内のWebアプリケーションに対して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はHTTPSをトランスポートの機密性の保証として使用するために、一致するurl-patternを構成済みのポートにリダイレクトします。

そのため、特定の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、executorなどの重要な属性を入れていないサンプル構成です。

最も重要なことは、HTTPS接続を提供するために必要なキーストア設定です。 こちら Java HTTPSを提供するTomcatのキーストアを準備する公式ドキュメントがあります。

17
malaguna

これをTomcat_dir/conf/web.xmlの最後に追加することにより、Tomcatにデプロイされたすべてのアプリに対して実行できます。

<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で変更する必要はありません。

これでうまくいくはずですすでに別のポート(通常は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>
16
Mateus Viccari

HTTPからHTTPへの次のリダイレクトルールを既に持っている実行中のTomcatアプリケーションがあります。

malagunaが答えたように、そのConnector設定はnotリダイレクト規則。 _<transport-guarantee>CONFIDENTIAL</transport-guarantee>_によってトリガーされるリダイレクトを実行するときに使用される設定です。

その設定をアプリケーションごとに上書きする方法はありません。

このようなリダイレクトをより適切に制御する必要がある場合は、リダイレクト(if (!request.isSecure()) { response.sendRedirect(...);})を実装する独自のフィルターを実装するか、 サードパーティのもの を構成する必要があります。

//技術的には、現在のTomcat 8コードでは、transport-guarantee_によってトリガーされたリダイレクトはorg.Apache.catalina.realm.RealmBase.hasUserDataPermission(...)メソッドによって実行されます。

10

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にリダイレクト

2
tkhm
        <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>
0
Renat Gatin

Tomcat 9 server.xmlファイル

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
    scheme="https"
    secure="true"
    redirectPort="8443"/>

<Connector port="8443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" 
           SSLEnabled="true"
           scheme="https"
           secure="true"
           >
    <SSLHostConfig sslProtocol="TLS" protocols="all" certificateVerification="false">
        <Certificate certificateKeystoreFile="conf/.keystore"
                     certificateKeystorePassword="123456"
                     certificateKeyPassword="123456"                                                  
                     type="RSA" />
    </SSLHostConfig>
</Connector>
0
Dimrad

Transport-guarantee CONFIDENTIALをconf/web.xmlに入れるのは良いことですが、マネージャーアプリとホストマネージャーアプリ(Tomcat 8.5.38)はカバーしません。

私の解決策は、すべてのhttp要求をhttpsにリダイレクトするconf/context.xmlにValveを配置することです。

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