2012-04-13 8 views
6

これはFAQですが、私は同じ質問であると認識したものは見つかりませんでした。Apache HTTPD/mod_proxy/Tomcatとクライアント認証付きSSL

TomcatでいくつかのWebアプリケーションを実行しています。 web.xmlの機密要素で定義されているSSLで保護されているログインページ。アプリケーションの1つは、証明書によるクライアント認証も受け入れます。私はかなり広範なJAASベースの認証&認証スキームも持っています。さまざまなWebアプリケーション間であらゆる種類の共有コードとJAAS設定などがあります。

私は本当に以下のことを達成しながらそれを妨害したくありません。

さらにTomcatインスタンスを追加する前に、ロードバランサとしてTomcatの前にmod-proxyとmod-proxy-balancerを挿入しています。

私がHTTPSリクエストに対して成し遂げたいのは、SSLエンドポイントであるHTTPDを使わずに、HTTPDが「ブラインド」にリダイレクトされていることです。すなわち、HTTPDは、暗号文をTomcatに直接渡して、TCがログイン、SSL、web.xml機密性保証、最も重要なのはクライアント認証です。

これは私が記述した構成で可能ですか?

私はwebapps、SSL、HTTPS、Tomcatについてよく知っていますが、Apache HTTPDの外側の範囲についての知識は限られています。

必要であれば、これは移動しますが、設定ファイルを使用したプログラミングの一種である持って幸せ;)

+0

@downvoterあなたのポイントは? – EJP

答えて

7

これは、私はそれは不可能だと答えましたthis question、に似て聞こえる:

することができますApacheからSSL/TLSトラフィックをTomcatに中継するだけです。 ApacheでSSL接続が終了してから、 SSL([HttpdとTomcatの間のSSL]間の通信はこの場合はほとんど役に立ちません)の をクライアントが直接Tomcatに接続して処理させるようにする必要がありますSSL 接続。

私は、この主張を裏付けるためのリンクが少し不足していることを認めます。私は間違っているかもしれないと思います(私はこのことを一度も見たことはありませんが、それは厳密には存在しないという意味ではありません...)。

ご存じのように、ユーザーエージェントとSSLエンドポイント(この場合はTomcatにしたい)間で、直接接続または完全に中継された接続が必要です。これは、Apache HttpdがURLを調べることができないことを意味します。ホスト名を最もよく知る(Server Name Indicationを使用する場合)。

mod_proxy documentationにURLに依存していないようです唯一のオプションは、HTTPS用前方プロキシサーバを使用何である、AllowCONNECTです。

Even the options in mod_proxy_balancerでも、設定のある時点でパスが必要です。そのドキュメントにはSSL/HTTPS(「はHTTP、FTP、AJP13プロトコルのロードバランシングをサポートしています」)は記載されていませんが、mod_proxyは少なくともCONNECTと書かれています。

私はオプションのカップルをお勧めします:

  • 直接Tomcatの中の接続を終了し、からhttpdを経由せず、iptablesベースのロードバランサを使用しました。

  • HttpdでSSL/TLS接続を終了し、Tomcatに対してプレーンHTTPリバースプロキシを使用します。

この2番目のオプションは、クライアント証明書とTomcatのセキュリティ上の制約に対処するためにもう少し設定が必要です。

ウェブアプリケーションを<transport-guarantee>CONFIDENTIAL</transport-guarantee>に設定した場合、TomcatはプレーンなHTTPポートからのものであるにもかかわらず、接続を安全とフラグを立てる必要があります。 Tomcat 5の場合(元はフランス語ですが、自動翻訳はそれほど悪くはありません)を設定してisSecure()にバルブを設定する方法を説明しています。 (valvesに慣れていない場合は、フィルタに似ていますが、要求がWebアプリケーションに伝播される前にTomcat自体の中で動作しています。Catalina内で設定できます)Tomcat 5.5から、HTTP connector secure optionは、あなた自身のバルブを必要とせずに。 AJPコネクタにも同様のオプションがあります(mod_proxy_ajpまたはmod_jkを使用している場合)。

AJPコネクタを使用している場合、mod_proxy_ajpはチェーン内の最初の証明書を転送し、通常の要求属性を使用してTomcat内で利用可能にします。おそらくSSLOptions +ExportCertData +StdEnvVarsが必要です。 mod_jk(私が知る限り、これまで推奨されていませんが)は、クライアントが送信したチェーン全体を転送することもできます(JkOptions +ForwardSSLCertChainを使用)。これは、proxy certificates(エンドエンティティ証明書までのチェーンがないと無意味です)を使用する場合に必要です。

mod_proxy_httpを使用する場合は、an HTTP header (mod_header)で証明書を渡してください(RequestHeader set X-ClientCert %{SSL_CLIENT_CERT}sなど)。正確な詳細は覚えていませんが、このヘッダーをクリアしてクライアントのブラウザからは得られないようにすることが重要です。フルチェーンが必要な場合は、this Httpd patch attemptを試すことができます。この手法では、ヘッダをjavax.servlet.request.X509Certificate(PEMブロックを解析することによって)にするために余分なバルブ/フィルタが必要になるでしょう。

関心のある他のポイントのカップル:

  • 私はよく覚えている場合は、からhttpdとconfigure it to use themに対して明示的にCRLファイルをダウンロードする必要があります。使用しているHttpdのバージョンによっては、restart it to reload the CRLsが必要な場合があります。
  • クライアント証明書を取得するために再ネゴシエーションを使用している場合、CLIENT-CERTディレクティブは、私が知っている限り、Httpdがクライアント証明書を要求することはありません(SSLSessionにアクセスできるバルブ経由で行われます)。直接JSSEコネクタ)。クライアント証明書を要求するには、Httpdで一致するパスを設定する必要があります。
+0

ありがとうブルーノ。 (a)クライアントにSSLエンドポイントとしてHTTPDを指定して、(a)HTTPDとTomcatの間で平文を使用し、(b) ' CONFIDENTIAL'を取り除く必要があります。コードでisSecure() 'を検索して破棄し、(d)' mod_proxy_ajp'を使用して証明書が届くようにします。実際にはすでに行っています。私は、HTTPSとcertsなどのためのHTTPDの設定を処理することができます – EJP

+0

私がこれまでに見ることができる唯一の大きな問題は、クライアント証明書です。私はTomcatがブラウザのポップアップを避けるようにそれらを要求しないように設定しました。そして、クライアント証明書認証を持つアプリケーションのクライアントに対して、それがまだ証明書を持っていなければ、再ハンドシェークを行うTomcatの魔法があります。 HTTPDで可能な場合はどうすればそれを実現するか、あるいはクラスタ内にそのアプリケーションを置かないようにする必要があります。とにかく低容量です。それ以外は、これは良いと思う。 – EJP

+1

''要素に 'SSLVerifyClient none'と' SSLVerifyClient optional/require'を入れることができるかもしれませんが、パスはwebappが予期しているものに固有でなければなりません。 – Bruno

関連する問題