我正在开发一个Web应用程序,该应用程序在使用Jersey进行Web服务调用期间使用客户端证书对Tomcat进行身份验证。到目前为止,这工作非常顺利,但我需要一个可以让我管理这个应用程序的相同上下文的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>
[...]
谢谢EJP,我试过你的解决方案,但现在我不能连接到Tomcat了(如果我使用证书也没关系)。我上面发布了我的尝试 - 你能发现一个错误吗? – EddyYosso 2010-11-21 13:21:20