Glassfish 2.1 КЛИЕНТ-СЕРТ как получить Принципал - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть веб-приложение, которое я хочу использовать с клиентским сертификатом.Я настроил следующее в своем файле web.xml, и я могу получить доступ к своему приложению через https.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>securedapp</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>DELETE</http-method>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
    </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>

Рукопожатие работает отлично.Я использую сертификат только как меру безопасности зерна.Я просто хочу знать принципала поставляемого сертификата, логин как таковой не требуется.Тем не менее, когда я пытаюсь получить принципал от сеанса, это ноль.

Я также пытался

X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");

, но это также ноль.Кто-нибудь знает, как я могу получить основную сумму из моего сертификата?

Большое спасибо Ноуш

1 Ответ

0 голосов
/ 21 декабря 2011

Вы уверены, что Glasfish действительно запрашивает сертификат клиента?

Я пытался сделать то же самое с Tomcat, и я обнаружил, что Tomcat запрашивает сертификат клиента, только если вы добавили auth-constraint в security-constraint следующим образом:

<security-constraint>
    ...
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
    ...
</security-constraint>

Без auth-constraint Tomcat не требуется входить в систему пользователя, поэтому не требуется запрашивать сертификат клиента. transport-guarantee вызывает только HTTPS.

Но даже при этом мне пришлось добавить пользователя сертификата в управление ролями контейнера и назначить ему роль, поскольку в противном случае пользователь не сможет получить доступ к URL-адресу и получит ответ HTTP 401. Поэтому, если вы просто хотите получить сертификат клиента, не связывая его с пользователем в контейнере, он не будет работать.

В Tomcat вы можете настроить область для принятия пользователя без ролей, когда role-name равен *, но вам все равно нужно добавить пользователя в область аутентификации, что не поможет, если вы хотите принять все сертификаты, которым доверяют, и проверьте субъект сертификата самостоятельно. Может быть, это возможно с Glasfish.

...