これはこの質問に似ていますが、私はそれは不可能だと答えました:
SSL/TLS トラフィックを Apache から Tomcat に中継することはできません。SSL 接続が Apache で終了し、Tomcat へのトラフィックをリバース プロキシする必要があります (この場合、[Httpd と Tomcat の間の] SSL はほとんど役に立ちません)。または、クライアントを Tomcat に直接接続させて SSL 接続を処理させます。 .
この主張を裏付けるリンクが少し不足していることは認めます。私は間違っているかもしれないと思います(これが行われたのを見たことはありませんが、厳密には存在しないという意味ではありません...)。
ご存知のように、ユーザー エージェントと SSL エンドポイント (この場合、Tomcat にする必要があります) の間に直接接続、または完全に中継された接続が必要です。これは、Apache Httpd が URL を調べることができないことを意味します。せいぜいホスト名を知っているだけです (サーバー名表示を使用している場合)。
mod_proxy
ドキュメントの URL に依存していないように見える唯一のオプションは、HTTPS のフォワードプロキシ サーバーにAllowCONNECT
使用されるものです。
のオプションでmod_proxy_balancer
さえ、構成のある時点でパスを想定しています。そのドキュメントでは、SSL/HTTPSについて言及していません (「HTTP、FTP、および AJP13 プロトコルのロード バランシング サポートを提供します」) 。mod_proxy
CONNECT
いくつかのオプションをお勧めします。
この 2 番目のオプションでは、クライアント証明書と Tomcat のセキュリティ制約を処理するために、もう少し構成が必要です。
で webapp を構成し<transport-guarantee>CONFIDENTIAL</transport-guarantee>
た場合は、Tomcat がプレーンな HTTP ポートから接続されていることを認識しているにもかかわらず、Tomcat が接続に安全なフラグを立てる必要があります。Tomcat 5 については、 set にバルブを実装する方法を説明する記事(元はフランス語ですが、自動翻訳はそれほど悪くありません)isSecure()
です。(バルブに慣れていない場合、それらはフィルターに似ていますが、リクエストが webapp に伝達される前に Tomcat 自体で動作します。Catalina 内で構成できます)Tomcat 5.5 から、HTTP コネクタsecure
オプションは正確に機能すると思いますつまり、独自のバルブを必要としません。AJP コネクタにも同様のオプションがあります (mod_proxy_ajp
またはを使用する場合mod_jk
)。
AJP コネクタを使用している場合mod_proxy_ajp
は、チェーン内の最初の証明書を転送し、Tomcat 内で (通常の要求属性を介して) 使用できるようにします。おそらく必要になるでしょうSSLOptions +ExportCertData +StdEnvVars
。mod_jk
(私が知る限り非推奨ですが)クライアントから送信されたチェーン全体を( を使用してJkOptions +ForwardSSLCertChain
)転送することもできます。これは、プロキシ証明書を使用する場合に必要になる場合があります(エンドエンティティ証明書までのチェーンがなければ意味がありません)。
を使用したい場合は、HTTP ヘッダー ( )mod_proxy_http
経由で証明書を渡すのがコツです。たとえば、. 正確な詳細は覚えていませんが、このヘッダーがクライアントのブラウザー (別の方法で偽造される可能性がある) から送信されないように、このヘッダーがクリアされていることを確認することが重要です。完全なチェーンが必要な場合は、この Httpd パッチ試行を試すことができます。このアプローチでは、 (PEM ブロックを解析することによって)ヘッダーを に変換するために、おそらく追加のバルブ/フィルターが必要になります。mod_header
RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}s
javax.servlet.request.X509Certificate
興味深いかもしれない他のいくつかのポイント:
- 私の記憶がよければ、Httpd 用に明示的に CRL ファイルをダウンロードし、それらを使用するように構成する必要があります。使用している Httpd のバージョンによっては、CRL をリロードするために再起動する必要がある場合があります。
- クライアント証明書を取得するために再ネゴシエーションを使用している場合
CLIENT-CERT
、私の知る限り、ディレクティブは Httpd にクライアント証明書を要求させません (これはSSLSession
、JSSE コネクタを直接使用するときにアクセスできるバルブを介して行われます)。クライアント証明書を要求するには、Httpd で一致するパスを構成する必要がある場合があります。