我有一个简单的 Spring Boot 服务 (service A
),它暴露了一些 REST API。为了添加 https 支持,我使用了颁发给同一框中的另一个服务 (service B
) 的相同证书。这是我的 application.properties 文件
server.ssl.enabled=true
server.ssl.client-auth=need
server.ssl.key-store=keystore.jks
server.ssl.key-store-password=password
server.ssl.key-store-type=JKS
server.ssl.trust-store-password=password
server.ssl.trust-store=keystore.jks
server.ssl.trust-store-type=JKS
当连接到 service A
时,这似乎有效。由不是 service B
的客户制作.我启用了服务之间的相互身份验证,以便验证客户端证书。当从 B
发出请求时至A
,我收到错误javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
at sun.security.ssl.Alert.createSSLException(Alert.java:131)
at sun.security.ssl.Alert.createSSLException(Alert.java:117)
启用 ssl 调试后,我发现此错误是导致此问题的原因upcoming handshake states: server finished[20]
*** Certificate chain
<Empty>
***
https-jsse-nio-8090-exec-4, fatal error: 42: null cert chain
我检查并重新检查 keystore 和信任库是否设置正确,但没有运气。有没有办法可以让具有相同证书的服务器和客户端一起工作?感谢我如何使它工作(使用相同的证书)的任何指示,因为我已经为此苦苦挣扎了一周。
最佳答案
您的 JKS 是否包含整个链条?如果你往里看,你有没有一直到根证书的整个链条?
错误告诉你它找不到链。您的证书可能是自签名的?或者你的 JKS 没有完整的链条。
查看类似的 Stackoverflow 问题:CamelJettyWebSocketServer, fatal error: 42: null cert chain
关于java - 同一台机器上具有相同证书的两个服务之间的相互认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65012210/