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 )、上記のコネクタを変更/削除せずに?
示したコネクタ構成は、特定の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のキーストアを準備する公式ドキュメントがあります。
これを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>
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(...)
メソッドによって実行されます。
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にリダイレクト
<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>
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>
Transport-guarantee CONFIDENTIALをconf/web.xmlに入れるのは良いことですが、マネージャーアプリとホストマネージャーアプリ(Tomcat 8.5.38)はカバーしません。
私の解決策は、すべてのhttp要求をhttpsにリダイレクトするconf/context.xmlにValveを配置することです。