我的目标是通过要求服务器要求客户端证书来提高我的测试服务器的安全性。
Tomcat server.xml (conf/server.xml) 包含:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
scheme="https" secure="true" SSLEnabled="true"
port="443"
clientAuth="true"
keyAlias="posh"
maxThreads="200" acceptCount="100"
minSpareThreads="5" maxSpareThreads="75"
keystoreFile="conf/keystore.jks"
keystoreType="JKS" keystorePass="somePassword"
enableLookups="true" disableUploadTimeout="true"
truststoreFile="conf/keystore.jks"
truststoreType="JKS" truststorePass="somePassword"
SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2"
sslProtocol="TLS"/>
Tomcat web.xml (conf/web.xml) 包含:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
...
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
<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>
...
</web-app>
我的 catalina 日志中没有出现错误:
... 2016 年 1 月 26 日 15:29:59.023 信息 [主] org.apache.coyote.AbstractProtocol.start 启动协议处理程序 [“http-nio-8080”] 2016 年 1 月 26 日 15:29:59.420 信息 [主] org.apache.coyote.AbstractProtocol.start 启动 ProtocolHandler ["http-nio-443"] 26-Jan-2016 15:29:59.421 INFO [main] org.apache.coyote.AbstractProtocol.start 启动 ProtocolHandler ["ajp- nio-8009"] 26-Jan-2016 15:29:59.422 INFO [main] org.apache.catalina.startup.Catalina.start 服务器在 24056 毫秒内启动
目前不确定这是否重要,但 conf/keystore.jks 产生以下列表:
root@Posh:/opt/tomcat/conf# keytool -list -keystore keystore.jks -storepass somePassword
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 2 entries
posh, Jan 26, 2016, PrivateKeyEntry,
Certificate fingerprint (SHA1): 0F:DA:1D:B3:5C:37:60:D0:46:8B:7C:DE:F3:96:2E:DE:A2:4E:2F:B5
clientcert, Jan 26, 2016, trustedCertEntry,
Certificate fingerprint (SHA1): 42:16:28:7E:17:2D:6C:B4:61:F4:8D:DA:B7:6E:90:E4:9F:3E:FC:83
我的 Tomcat 8 配置在 authbind() 下以 Ubuntu 14.04 上的 tomcat 用户身份开箱即用。
连接到站点的客户端可以接受服务器证书并在没有客户端证书的情况下自由访问所有部署的应用程序。
我希望 Tomcat 在允许访问应用程序之前会“要求”每个客户端的客户端证书。
如何更改配置以要求/要求客户端证书以访问站点上的任何/所有应用程序?