Tomcat REST API项目配置SSL后未校验客户端证书问题咨询
配置遗漏与问题修复方案
1. 优先排查端口访问问题
先确认Postman访问的是https://<你的域名/IP>:8443/my-api/*路径,而非默认8080端口的HTTP接口。你需要先把conf/server.xml中默认的8080端口HTTP Connector注释掉,避免请求绕开HTTPS校验直接走HTTP接口。2. 修复Connector配置冲突
你当前的Connector同时配置了clientAuth="true"和SSLVerifyClient="require",两个参数功能重复,且部分旧版本参数在Tomcat 9中可能出现兼容性问题导致双向SSL不生效。建议替换为Tomcat 9标准的SSL配置写法,示例如下:
其中<Connector port="8443" maxThreads="200" scheme="https" secure="true" SSLEnabled="true"> <SSLHostConfig certificateVerification="required" protocols="TLSv1.2,TLSv1.3" truststoreFile="file:///C:/nameOfFolders/apache-tomcat-9.0.12/server.jks" truststoreType="JKS" truststorePassword="myPassword" certificateVerificationDepth="2"> <Certificate certificateKeystoreFile="file:///C:/nameOfFolders/apache-tomcat-9.0.12/server.jks" certificateKeystoreType="JKS" certificateKeystorePassword="myPassword" certificateKeyPassword="myPassword"/> </SSLHostConfig> </Connector>certificateVerification="required"等价于旧版的clientAuth="true",会强制TLS层校验客户端证书,无证书的请求会在握手阶段直接被拒绝。3. 补充Realm配置
你在web.xml中配置了CLIENT-CERT认证和example角色校验,但没有配置对应的Realm实现,会导致应用层证书身份校验不生效。默认可以使用Tomcat自带的UserDatabaseRealm,配置方法如下:- 确认
conf/server.xml中存在如下Realm配置(默认是开启的):
<Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm>- 编辑
conf/tomcat-users.xml,添加和客户端证书CN字段同名的用户,并分配example角色:
CLIENT-CERT认证会自动提取客户端证书的CN作为用户名,和tomcat-users.xml中的配置做匹配,匹配成功且角色符合要求才能访问接口。<role rolename="example"/> <user username="<客户端证书的CN值>" password="nopass" roles="example"/>- 确认
4. 校验安全约束匹配规则
确认Postman访问的路径完全匹配/my-api/*规则,若你访问的是应用根路径或其他路径,不会触发当前配置的安全约束。5. 确认信任库配置正确
你当前使用服务端密钥库同时作为信任库,需要提前将所有允许访问的客户端证书的根证书/签发证书导入到该jks文件中,否则即使客户端携带证书也会校验失败。导入命令参考:keytool -import -alias client-ca -file example.cer -keystore server.jks -storepass myPassword
内容的提问来源于stack exchange,提问作者Wiliane Souza
相关产品推荐
相关产品推荐

