一段时间以来,我一直在用头撞墙,希望有人能解释我做错了什么。我有一个 tomcat 服务器,在该服务器上部署了一个应用程序并正在联系另一个服务。一切正常,直到客户端在其负载均衡器上启用客户端身份验证。Tomcat ->app->lb with client auth -> endpoint 在 jvm 上启用握手调试会返回:
javax.net.ssl|FINE|0F|myScheduler-1| UTC|ServerHelloDone.java:151|Consuming ServerHelloDone handshake message (
<empty>
)
javax.net.ssl|FINE|0F|myScheduler-1| UTC|CertificateMessage.java:299|No X.509 certificate for client authentication, use empty Certificate message instead
javax.net.ssl|FINE|0F|myScheduler-1| UTC|CertificateMessage.java:330|Produced client Certificate handshake message (
"Certificates": <empty list>
)
据我所知,这意味着没有找到符合客户端身份验证要求的证书。应用程序和 tomcat 的 SSL 端口有它们定义的密钥库和密钥对,虽然两者都不同,但两者都应该通过,因为客户端身份验证只要求使用某个 CA 签名的证书(它们都是)。在 cacerts 中,我拥有 CA 当局的所有必需证书。我尝试将证书本身放入 cacerts 但结果相同。Tomcat 端口配置:
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2"
keystoreFile="/usr/local/tomcat/config/pkcs_keystore.jks"
keystorePass="***************"
keyAlias="server_alias" />
我尝试通过浏览器连接到端点,果然它要求我提供证书,我为它提供了“server_alias”证书,它完美地工作,所以我不知道为什么它不能与 tomcat 一起工作。
我是一名系统工程师,所以我不知道这是否可能必须在应用程序本身内完成?欢迎任何帮助。