我有一个Web应用程序,我想使用客户端证书。我已经在我的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");
但这也是空的。有谁知道如何从我的证书中获得校长?
非常感谢 Noush
答案 0 :(得分:0)
你确定Glasfish实际上要求客户证书吗?
我尝试用Tomcat做同样的事情,我发现,如果你在auth-constraint
中放置security-constraint
,Tomcat只会请求客户端证书:
<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来说是可能的。