2010-11-20 3 views
5

JerseyでWebサービスを呼び出すときにクライアント証明書を使用してTomcatを認証するwebappを開発しています。これまでのところうまくいっていますが、私はこのアプリケーションを管理するのと同じコンテキストでWebフロントエンドが必要です。 SSL設定は「コンテキストごと」であるため、フロントエンドでhttpsを使用する唯一のオプションは、クラウドストアにクライアント証明書をインストールしているようです(Tomcatのトラストストアにもリストされています(httpsの使用をすべて破棄するか、 。TomcatのURLに基​​づいてHTTPS証明書の使用を設定する

1. https://url-to-webapp/ws <- Should use client certificate 
2. https://url-to-webapp/web <- Should just use a server certificate 

は、Tomcatの設定で、あるいはアプリケーションコードで何とかこれを達成することができます:私が本当に欲しいものを説明するために

更新

私はEJPによって提案された構成を試みたが、今私は関係なく、証明書の私の使用のTomcatに接続することはできません - ルックアップか何か中に失敗しているようです。しかし8080でHTTPコネクタを作成すると、8443にリダイレクトされます。これは私が使用している設定です。何か案は?

のTomcat-users.xmlの

<tomcat-users> 
<role rolename="webservice"/> 
<user username="CN=ClientCert,OU=Corp,O=Corp,L=London,S=London,C=UK" password="" roles="webservice"/> 
</tomcat-users> 

のserver.xml

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
maxThreads="150" scheme="https" secure="true" 
clientAuth="true" sslProtocol="TLS" 
keystoreFile="c:\tomcat\keys\server.jks" keystorePass="password" 
truststoreFile="c:\tomcat\keys\client.jks" truststorePass="password"/> 

のweb.xml

[...] 
    <security-constraint> 
     <display-name>ClientCertificateRequired</display-name> 
     <web-resource-collection> 
      <web-resource-name>MyWebService</web-resource-name> 
      <description/> 
      <url-pattern>/webservice/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>webservice</role-name> 
     </auth-constraint> 
     <user-data-constraint> 
      <description/> 
      <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
     </user-data-constraint> 
    </security-constraint> 
    <login-config> 
     <auth-method>CLIENT-CERT</auth-method> 
     <realm-name>tomcat-users</realm-name> 
    </login-config> 
    <security-role> 
     <description/> 
     <role-name>webservice</role-name> 
    </security-role> 
    [...] 
    <servlet> 
     <display-name>Webservice</display-name> 
     <servlet-name>Webservice</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     [...] 
      <run-as> 
      <role-name>webservice</role-name> 
     </run-as> 
    </servlet> 
    [...] 

答えて

2

だけ確保と機密性と特定の両方を必要として最初のURLを定義しますSSLクライアント認証を使用してWebアプリケーションを定義します。 2番目のURLは、ロールを必要としないものとして定義します。これはweb.XMLのすべてです。アイデンティティとロールを取得するための適切なレルムを定義します。

+0

Thanks EJP、私はあなたのソリューションを試しましたが、私はTomcatにもう接続できません(証明書を使用するかどうかは関係ありません)。私は上記の試みを掲示しました - あなたは間違いを見つけられますか? – EddyYosso

4

(最初のネゴシエーションではなく)クライアント証明書の再ネゴシエーションを使用するようにTomcatを設定できるため、クライアント証明書を要求するかどうかは要求されたURLによって異なります。

これを行うには、コネクタ設定でclientAuth="false"を使用し、次にクライアント証明書で保護するWebアプリケーションで<auth-method>CLIENT-CERT</auth-method>を使用する必要があります。

これは再ネゴシエーションを使用するため、TLS再ネゴシエーションのバグの問題に対処する必要があることに注意してください。要するに、2009年11月頃に公開されたTLSプロトコルの欠陥がありました。即時のセキュリティ修正は、再ネゴシエーションを無効にすることでした(非安全オプションを強制しない限り)。その後、RFC 5746の実装が無効になりました。 Oracle Java Transport Layer Security (TLS) Renegotiation Issue Readme

何をしようとしているのか、再ネゴシエーションを有効にする必要があります。これを安全にするには、JREリリース1.6.0_22を使用する必要があります。

関連する問題