12

TomcatWebアプリケーションが着信接続にクライアント証明書認証を使用するようにしようとしています。server.xmlでclientAuth=trueを使用するとすべて正常に機能しますが、同じサーバーで実行されている他のアプリケーションのため、本番環境ではこれを使用できません。

clientAuth = trueと同じ方法で、アプリケーションのクライアント証明書の使用を強制するようにweb.xmlドキュメントを作成する方法はありますか?CLIENT-CERT設定を使用するには、システムにアクセスする証明書ごとにTomcatユーザーアカウントを設定する必要があるようです。サブジェクトが特定のルール(実際のアプリケーション内でチェックされる)に一致する、指定されたCA(サーバートラストストアに設定されている)からのすべての証明書を許可できる必要があります。次のようなものがうまくいくことを期待していましたが、まだ運がありません!

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Everything</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
</login-config>
4

2 に答える 2

7

まず第一に、それはあなたが望むように聞こえますclientAuth=wantclientAuth=trueそれはクライアントが証明書を提供することを可能にしますが、絶対にそれを要求するわけではありません。

Principalあらゆる種類の認証を使用する場合、Tomcat(またはそのことについては任意のサーブレットコンテナ)は、そのオブジェクトからオブジェクト(通常はユーザー名)を持つオブジェクトを構築できる必要があります。次に、コンテナは、特定のリクエストを適切に承認するために、ユーザーが持つ役割を決定する必要があります。したがって、Tomcatは、認証を機能させるために、事前にユーザーについて知る必要があります。

一方、認証が必要ない場合は、を設定clientAuth=wantしてから、を使用しFilterて証明書を検証できます。CLIENT-CERTすでに独自のチェックを行っている場合は、認証を使用する必要はありません。

于 2012-08-01T18:55:40.337 に答える
3

私は上記の問題の解決策を再検討していて、最終的に解決策を見つけました:

  1. コネクタclientAuth="false"属性を使用してTomcatを構成します(そうでない場合、サーバーへのすべての安全な接続は、相互、クライアントサーバー、SSL認証を行います。

  2. 以下をweb.xmlに追加します(ここで例を示しました)

    <security-constraint>
        <web-resource-collection>
            <url-pattern>/LoginTestServlet1</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>manager</role-name>
        </auth-constraint>
        <user-data-constraint>
            <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE -->
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
     <security-constraint>
        <web-resource-collection>
            <url-pattern>/LoginTestServlet2</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>manager</role-name>
        </auth-constraint>
       <!--  <user-data-constraint>
            transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
        </user-data-constraint> -->
    </security-constraint>
     <login-config>
        <auth-method>CLIENT-CERT</auth-method>
        <realm-name>certificate</realm-name>
      </login-config>
    

    マネジャー

  3. tomcat users-users.xmlに以下を追加します(トラストストアにほぼ同一の証明書がある場合は、証明書を次のように明確に識別する必要があることに注意してください)。

    <role rolename="manager"/>
    

    <user username = "EMAILADDRESS = hamzas100@yahoo.com、CN = KS、OU = OFF、O = OFS、L = Bukhara、
    ST = Bukhara、C = UZ" password = "" roles = "manager" />

  4. ブラウザ(またはcurl)のアドレス行に入力します。

    https://yourdomain.com:8443/LoginTest/LoginTestServlet1または
    https://yourdomain.com:8443/LoginTest/LoginTestServlet2

  5. これを機能させるには、ブラウザの個人証明書リストに証明書を追加する必要があります(ブラウザでテストしている場合)。私はMozillaFirefoxを試してみましたが、これを簡単に実行できます(ただし、b12証明書のみを受け入れるため、java keytoolでopensslを使用することをお勧めします)。すべてが正しく構成されている場合は、mozillaから既存の証明書から証明書を選択するように求めるプロンプトが表示されます。curlを使用している場合(自動Webインターフェイステストに使用され、次のコマンドラインを使用してテストします(ここで例を示しました)。トラストストアにインポートした証明書を選択する必要があることに注意してください。

    curl -s -k --cert selfsigned.pem --key key.pem -v --anyauth https://yourdomain.com:8443/LoginTest/LoginTestServlet1--cacertselfsigned.pemまたはcurl-s-k --cert selfsigned.pem --key key.pem -v --anyauth http://yourdomain.com:8080/LoginTest/LoginTestServlet2 --cacert selfsigned.pem

注:私のコネクタは次のようになります。

<Connector port="8443"
       maxThreads="150"  scheme="https" secure="true" SSLEnabled="true"
       sslProtocol="TLS" keystoreType="PKCS12"  truststoreType="PKCS12" clientAuth="false"
               keystoreFile="C:/Program Files/glassfish-3.1.2/glassfish/domains/domain1/config/cacerts.pkcs12"
               truststoreFile= "C:/Program Files/glassfish-3.1.2/glassfish/domains/domain1/config/cacerts.pkcs12"
               truststorePass="changeit"
               keystorePass="changeit"
               protocol="org.apache.coyote.http11.Http11Protocol">
于 2013-06-16T08:08:17.310 に答える