2012-08-01 41 views
9

我正在尝试使Tomcat Web应用程序对传入连接使用客户端证书身份验证。在server.xml中使用clientAuth = true时,一切正常,但由于其他应用程序在同一台服务器上运行,因此我们无法在生产环境中使用它。在没有指定用户名的情况下使用CLIENT-CERT for Tomcat

有没有办法形成一个web.xml文档,以便像clientAuth = true一样强制应用程序的客户端证书使用?似乎使用CLIENT-CERT设置还需要为每个要访问系统的证书设置一个tomcat用户帐户?我们需要能够允许来自指定CA(在服务器信任库中设置)的主体匹配某些规则(在实际应用程序中进行检查)的所有证书。我希望像下面这样的东西可以工作,但没有运气!

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Everything</web-resource-name> 
     <url-pattern>/*</url-pattern> 
    </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> 

回答

4

首先,这听起来像你想clientAuth=want而不是clientAuth=true:将允许客户端提供证书,但不是绝对需要的。

当你使用任何一种,Tomcat的(或与此有关的任何servlet容器)的认证必须能够建立一个Principal对象了它 - 一个有一个名字(通常是用户名)。然后容器必须决定用户具有什么样的角色,以便授权特定的请求。所以,Tomcat需要事先知道用户,以便授权工作。另一方面,如果您不需要任何授权,则可以设置clientAuth=want,然后使用Filter来验证证书。如果您已经在进行自己的检查,则不需要使用CLIENT-CERT身份验证。

+1

在连接器配置中'clientAuth = false'和'web.xml'中的'CLIENT-CERT'允许您获得客户端证书以进行重新协商,如果您不想/需要其他webapps在浏览器中导致提示。 – Bruno 2012-08-01 18:58:45

+1

这就是我上面想要做的,但是看起来我可能误解了这里的CLIENT-CERT选项的用法。因此,web.xml中的CLIENT-CERT仅**用于使用证书作为特定用户进行身份验证?我迄今为止的大部分经验都是使用IIS,并且我希望Tomcat以同样的方式工作,您可以指定整个服务器,单个项目甚至单个页面是否需要在连接之前呈现有效的客户端证书允许。 – 2012-08-02 08:39:09

+0

@ Christopher-Schultz:我曾尝试过clientAuth = want,但确实有效,但我不确定它是否安全。然而,再想一想 - 如果没有提供证书,我们的代码无论如何都可以解决并拒绝它们。如果他们提供了一个客户端证书,那么在传递给我们的代码进行进一步验证之前,它可能必须经过Tomcat在clientAuth = true时执行的所有检查(例如,可信CA,范围内的有效性等)工作完全一样吗? – 2012-08-02 08:45:31

2

我只是指导员研究解决上述问题,并终于找到了一个解决方案:

  1. 配置tomcat与连接器clientAuth =“false”属性(否则到服务器的所有安全连接将做相互的,客户端服务器,SSL认证。

  2. 添加在web.xml以下(我刚才在这里的示例所示)

    <security-constraint> 
        <web-resource-collection> 
         <url-pattern>/LoginTestServlet1</url-pattern> 
         <http-method>GET</http-method> 
         <http-method>POST</http-method> 
        </web-resource-collection> 
        <auth-constraint> 
         <role-name>manager</role-name> 
        </auth-constraint> 
        <user-data-constraint> 
         <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE --> 
         <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
        </user-data-constraint> 
    </security-constraint> 
    <security-constraint> 
        <web-resource-collection> 
         <url-pattern>/LoginTestServlet2</url-pattern> 
         <http-method>GET</http-method> 
         <http-method>POST</http-method> 
        </web-resource-collection> 
        <auth-constraint> 
         <role-name>manager</role-name> 
        </auth-constraint> 
        <!-- <user-data-constraint> 
         transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE 
         <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
        </user-data-constraint> --> 
    </security-constraint> 
    <login-config> 
        <auth-method>CLIENT-CERT</auth-method> 
        <realm-name>certificate</realm-name> 
        </login-config> 
    

    经理

  3. 在Tomcat用户-users.xml中添加以下内容(请注意,如果信任存储具有几乎相同的证书,那么你应该清楚地确定你的证书,如下所示)

    <role rolename="manager"/> 
    

    <用户名= “[email protected],CN = KS,OU = OFF,O = OFS,L =布哈拉,
    ST =布哈拉,C = UZ” 密码= “” 角色= “经理”/>

  4. 在浏览器(或卷曲)地址行中输入

    https://yourdomain.com:8443/LoginTest/LoginTestServlet1
    https://yourdomain.com:8443/LoginTest/LoginTestServlet2

  5. 对于这个工作,你必须证书添加到浏览器的个人证书列表(如果您正在使用浏览器进行测试)。我已经尝试过使用Mozilla Firefox,它很容易让你这样做(但它只接受b12证书,所以建议你使用openssl和java keytool)。如果一切配置正确,那么您将从mozilla获得提示,从现有的证书中选择证书。如果您使用的是卷曲(用于自动Web界面测试,那么请使用以下命令行进行测试(我刚刚在此处给出了一个示例)。请注意,您应该选择导入到信任存储区的证书。

    curl -s -k --cert selfsigned.pem --key key.pem -v --anyauth https://yourdomain.com:8443/LoginTest/LoginTestServlet1 --cacert selfsigned.pem或 curl -s -k --cert selfsigned.pem --key key.pem -v --anyauth http://yourdomain.com:8080/LoginTest/LoginTestServlet2 --cacert selfsigned.pem

注:我的连接器看起来像如下:

<Connector port="8443" 
     maxThreads="150" scheme="https" secure="true" SSLEnabled="true" 
     sslProtocol="TLS" keystoreType="PKCS12" truststoreType="PKCS12" clientAuth="false" 
       keystoreFile="C:/Program Files/glassfish-3.1.2/glassfish/domains/domain1/config/cacerts.pkcs12" 
       truststoreFile= "C:/Program Files/glassfish-3.1.2/glassfish/domains/domain1/config/cacerts.pkcs12" 
       truststorePass="changeit" 
       keystorePass="changeit" 
       protocol="org.apache.coyote.http11.Http11Protocol"> 
+0

我已经测试了这个在Tomcat 6.0.35,但它与前人的精力GlassFish的工作太有一些变化与GlassFish web.xml文件 – 2013-06-16 08:18:00

+0

<安全角色映射> 经理 <委托人名称> EMAILADDRESS = hamzas100 @雅虎.com,CN = KS,OU = OFF,O = OFS,L =布哈拉,S =布哈拉,C = UZ <主体名称> 管理器 2013-06-16 08:20:31

+0

某些证书很容易添加到浏览器个人商店,如pkcs12证书。对于他们添加到Crome/Cromium和Internet Explorer浏览器(新版本)的个人证书存储区,只需双击它们并按照向导中的步骤操作即可。对于Mozilla Firefox v 21等其他用户,您必须在浏览器上进行手动操作。 – 2013-06-16 11:22:02

相关问题