2

Tomcat で Web アプリを実行しています。サーバーによって信頼された有効な証明書を持つすべてのユーザーに Web アプリへのアクセスを許可したいのですが、証明書からユーザーの DN を読み取りたいと考えています。clientAuth="true" ("want" も機能します) を使用して SSL コネクタを構成しました。web.xml には、クライアント証明書を提示する必要があるログイン制約があります。ユーザー証明書の署名に使用される CA 証明書を使用してトラストストアを構成しました。

クライアントは証明書を提示し、サーバーはそれを受け入れて、アプリへのアクセスを許可します。私の問題は、HttpServletRequest インスタンスで getUserPrincipal() を呼び出すと、null になることです。auth-constraint を web.xml に追加して、ユーザーが特定のロールに所属することを要求し、ユーザーが指定されたロールに所属するように構成されている場合、ユーザー プリンシパルは null ではありません。

HttpServletRequest の API によると、ユーザーが認証されていない場合、ユーザー プリンシパルは null になります。ユーザーは有効で信頼できる証明書を提示したため、認証されたと考えていますが、このコンテキストでの認証には承認が含まれているようです。

ユーザーを特定のロールに割り当てずに、有効な信頼できる証明書からユーザー プリンシパルにアクセスする方法はありますか?

プリンシパルが null になる web.xml スニペットを次に示します。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>My App</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
</security-constraint>
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>My Realm</realm-name>
</login-config>

そして、指定されたロールに対してユーザーが構成されている場合にユーザープリンシパルを取得できるようにする web.xml スニペットを次に示します。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>My App</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>Some Role</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>CLIENT-CERT</auth-method>
    <realm-name>My Realm</realm-name>
</login-config>
<security-role>
    <role-name>Some Role</role-name>
</security-role>
4

2 に答える 2

3

私がHttpServletRequest#getUserPrincipal()説明した状況では null を返しますが (ユーザーは認証されていますが、認証が必要または試行されていません)、ServletRequest#getAttribute("javax.servlet.request.X509Certificate")認証されたユーザーの証明書を含む証明書の配列を返すことを発見しました。

これは私の問題を解決しますが、の動作HttpServletRequest#getUserPrincipal()は「現在の認証済みユーザーの名前を含む java.security.Principal オブジェクトを返す」という API に従っていないように思えます。明示的な承認制約も適用して満足させる必要があることは言及されていませんが、Tomcat が実装した方法のようです。

于 2013-06-06T17:00:01.883 に答える
0

Tomcat は、すべての接続で証明書を要求するように構成されているか、要求されているリソースが特定の役割を必要としない限り、証明書を要求しません。

したがって、ユーザーが証明書を提示したというあなたの声明は正しくありません。

于 2013-06-01T22:50:53.560 に答える