同一台机器上具有相同证书的两个服务之间的相互认证

Mutual authentication between two services with same certificate on the same machine

我有一个简单的 spring 引导服务 (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 的客户端时,这似乎有效。我启用了服务之间的相互身份验证,以便验证客户端证书。当从 BA 发出请求时,我收到错误消息

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

我检查并重新检查了密钥库和信任库是否设置正确,但没有成功。有没有办法让我在具有相同证书的服务器和客户端上工作?感谢任何关于我如何让它工作(使用相同的证书)的指示,因为我已经为此苦苦挣扎了一个星期。

你的JKS包含全链吗?如果你看里面,你有整个链条一直到根证书吗?

错误提示您找不到链条。您的证书可能是自签名的?或者你的 JKS 没有完整的链。

查看类似的 Whosebug 问题: