强制需要tomcat上下文中的客户端证书

时间:2014-11-25 16:39:16

标签: tomcat ssl web.xml

在Google / StackOverflow上搜索了几个小时之后,我得出的结论是,没有人能够为此做出自上而下的答案,所以我会再次尝试再问。

我需要一个特定的Web应用程序来强制使用客户端证书(我的意思是FORCE)。 我的tomcat连接器被描述为(注意使用Apr配置变量):

<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           SSLEngine="on"
           SSLCertificateFile="conf/server.crt"
           SSLCertificateKeyFile="conf/server.key"
           SSLPassword="password"
           SSLCACertificateFile="conf/ca.crt"
           SSLVerifyClient="none"
            />

我使用此web.xml创建了一个简单的Web应用程序:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="...">
    <display-name>Security</display-name>

    <security-constraint>
        <display-name>ClientCertificateRequired</display-name>
        <web-resource-collection>
            <web-resource-name>any</web-resource-name>
            <description/>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <description/>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <login-config>
        <auth-method>CLIENT-CERT</auth-method>
    </login-config>
</web-app>

到目前为止,这么好。如果我使用webbrowser请求页面,我会被要求选择证书。这一切似乎都很不错。

当我点击取消时,我意识到我遇到了问题!页面只显示。这不是我的预期。

经过更多测试后,我开始意识到tomcat可能正在尝试以用户身份验证证书(我在添加角色要求时尝试过)。这是不可用的,因为无法在tomcat-users.xml中动态注册大量客户端证书。

有人可以解释我在这里做错了吗?

我希望此Web上下文在显示任何内容之前强制要求客户端证书,同时允许其他上下文排除这些要求。最好不要使用自定义servlet来执行额外的服务器端验证。

以最诚挚的问候, 罗里

1 个答案:

答案 0 :(得分:0)

在server.xml Connector部分中,尝试将SSLVerifyClient设置为optional(如Java中的wantClientAuth)或require(needClientAuth)。此SSL交换机由tcnative(openssl)控制,但不受tomcat(catalina)本身的控制。

请参阅:http://www.modssl.org/docs/2.1/ssl_reference.html#ToC13

顺便说一下,通过Http11NioProtocol启用SSL(tomcat使用JSSE实现)也不错。