2016-07-15 6 views
0

TomcatはSNIと相互認証の両方を提供していますが、選択したアプリケーション/パスに対してのみMAを有効にすることは可能ですか?私。のは、私は自分のサーバー上で以下のアプリケーション/エンドポイントを持っているとしましょう:/APP2 /人間が人間によって使用され、/APP2 /ロボットはロボット、コンピュータや他の機器で使用されている(そうさTomcat + SNI +相互認証

/app1 
/app2/human 
/app2/robot 

たとえば/ app2/humanはHTMLを提供し、/ app2/robotはJSONを提供します)。ここで、/app1/app2/humanへの接続を受け入れるようにTomcatを設定し、クライアントが有効な証明書を提示した場合にのみ/app2/robotに接続することができますか?

もちろん、アプリケーションごとに別々のポート/コネクタを設定することなくそれをやりたいのですが、これは簡単です。

ありがとうございます。

答えて

1

Tomcatは異なるパスに対して選択的相互認証を提供しませんが、このような選択的相互認証をWebアプリケーションレベル(特定のWebアプリケーションの内部ではない)に適用するだけでよい場合は、特殊なWebアプリケーションのために別の<Connector>を持つことで逃げることができます。これには別々の<Service>、したがって<Host>が必要です。もちろん、別のポート番号を使用する必要があります(ポートを保護するために使用できる別のネットワークインターフェイスを使用しない限り)。

私はそれを試したことはありませんが、理論的には特定のホスト名が異なるクライアント認証要件を持つようにSNI + client-authを設定できると思いますが、Tomcatにはこのようなコードはありません現在サポートしています。

Tomcatは異なるトラスト・ストアおよびホスト名ごとに異なるcertificateVerification設定を使用するように設定することができ、それはあなたがそれをパスあたりを変更することはできません。

もう1つの方法は、Tomcatにクライアント証明書を "必要"(または必要とする)ように設定してから、Filterを使って自分で検査を実行することです。 Filterは、パス単位で適用することができます。また、Tomcat固有の機能に依存していないため、アプリケーションの移植性が向上します。

このスレッドを見て、私がこれを数年前に行った方法を見てみましょう。いくつかのサンプルコードに加えて、私がすべての情報をどのようにまとめて得たかについての多くの参考文献があります:http://markmail.org/thread/vxwwli5nzt4itfr2

+0

私は、2番目のコネクタは非常に単純なことのためにひどいオーバーヘッドだと思います。 マークトーマスがTomcat 9でTLSバーチャルホスティングを追加したすてきなもので、これは困っている人にとっては本当に欠けている機能です。 –

+1

私はコミットをする人だけがどんな愛をも得ていると思う: –

1

thisによると、ドキュメントを読むことで、パスごとに選択的相互認証を行うことはできません。クライアントの認証がコネクタレベルで設定されているため、これはまったくまたは何もありません。あなたはおそらくSSL renegotation with client authを探していますが、これはApache HTTPdから慣れ親しんでいるかもしれないのでおそらく実装されていません。

+0

@マークトーマスは私がここにいますか? –

+0

ありがとう、それは私がSSLSocket、SSLSocketFactoryなどのクラスを見ると思ったことです。あなたがリンクされたポストに書かれているように、手作業で行うことができるようです - 「needClientAuth」の代わりに「wantClientAuth(true)」を設定し、「手動」検証を実行します - 実際はチェックするだけです(SSLSocket)ソケット).getSession()。getPeerCertificates() " - クライアントが認証されていない場合、javax.net.ssl.SSLPeerUnverifiedException例外がスローされます。 –

関連する問題