在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来执行额外的服务器端验证。
以最诚挚的问候, 罗里
答案 0 :(得分:0)
在server.xml Connector部分中,尝试将SSLVerifyClient设置为optional
(如Java中的wantClientAuth)或require
(needClientAuth)。此SSL交换机由tcnative(openssl)控制,但不受tomcat(catalina)本身的控制。