2010-11-20 52 views
5

我正在开发一个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> 
    [...] 

回答

2

只要定义第一URL作为担保,并要求机密性和特定角色,并将Web应用程序定义为使用SSL客户端身份验证。将第二个URL定义为不需要角色。这全在web.XML中。然后定义一个合适的领域来检查身份并从中获取角色。

+0

谢谢EJP,我试过你的解决方案,但现在我不能连接到Tomcat了(如果我使用证书也没关系)。我上面发布了我的尝试 - 你能发现一个错误吗? – EddyYosso 2010-11-21 13:21:20

4

您可以配置Tomcat使用客户端证书重新协商(而不是初始协商),以便是否要求客户端证书取决于请求的URL。

为此,需要在连接器配置中使用clientAuth="false",然后在要使用客户端证书保护的webapp中使用<auth-method>CLIENT-CERT</auth-method>

请注意,这使用重新协商,因此您可能需要处理TLS重新协商错误问题。简而言之,2009年11月左右发布了一个TLS协议缺陷。紧急安全解决方案是禁用重新协商(除非强制使用非安全选项),然后执行RFC 5746。请参阅第1阶段和第2阶段修复Oracle Java Transport Layer Security (TLS) Renegotiation Issue Readme

对于您要做的事情,您需要重新协商才能启用,为了确保安全,您必须使用JRE版本1.6.0_22。