クライアント証明書を要求するように Apache (2.4.7) を設定し、リバース プロキシとして、証明書内の情報を Tomcat 8 サーバーに転送することに成功しました。
ただし、Spring Bootで同じことを達成しようとすると、失敗します
The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /myapp
HTTP 502 エラー コードを返します。
関連する有効な Tomcat 構成は次のとおりです。
<Connector SSLEnabled="true" clientAuth="want" keyAlias="myalias"
keystoreFile="mystore.jks" keystorePass="mypassword" maxThreads="150"
port="8443" protocol="HTTP/1.1" scheme="https" secure="true"
sslProtocol="TLS" truststoreFile="mystore.jks" truststorePass="mypassword"/>
機能しない Spring Boot application.properties ファイルの関連部分:
server.context-path=/myapp
server.port=8443
server.ssl.enabled=true
server.use-forward-headers=true
server.ssl.protocol=TLS
server.ssl.client-auth=need
server.ssl.key-alias=myalias
server.ssl.key-store=/path/to/mykeystore.jks
server.ssl.key-store-password=mypassword
server.ssl.key-password=mypassword
server.ssl.trust-store=/path/to/mykeystore.jks
server.ssl.trust-store-password=mypassword
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.port-header=x-forwarded-port
アプリに直接アクセスする場合 (つまり、https://myapp.company.tld:12345/myappを要求する場合) は問題なく動作しますが、リバース プロキシ (つまり、https://proxy-load-balancer.company.tld: 12345/myapp ) は上記のエラーをスローします。
ポートの違い (12345 と構成済みの 8443) は、中間の Docker レイヤーが原因です。リバース プロキシとアプリケーションの両方がコンテナーで実行され、それらの開いているポート (Apache の場合は 443、Tomcat/Spring Boot の場合は 8443) が別のポート、つまり 12345。
よし、これで全て解決。まず、このSpringセキュリティ設定
server.ssl.client-auth=必要
組み込みの Tomcatは常に証明書を要求するため、クライアント => リバース プロキシ => Tomcat の状況では、AJP を使用しない限り認証できません。
しかし、それを使用することが判明しました
server.ssl.client-auth=欲しい
リクエストをさらに処理できるようになります。通常、人々が行うことは、リバース プロキシ レベルで証明書を処理し、一部の情報をバックエンド サーバー (Tomcat、Jetty など) に転送することです。
最終的に、開発者は、Spring Boot アプリケーションをこの後者の動作モードを処理するように適応させる必要がありました。つまり、転送された HTTP リクエストのヘッダーからデータを抽出し、それに基づいて認証を進めました。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加