【问题标题】:Mutual authentication between two services with same certificate on the same machine同一台机器上具有相同证书的两个服务之间的相互认证
【发布时间】:2020-11-25 20:24:31
【问题描述】:

我有一个简单的 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 的客户端建立时,这似乎有效。我启用了服务之间的相互身份验证,以便验证客户端证书。当从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

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

【问题讨论】:

    标签: java spring-boot ssl ssl-certificate


    【解决方案1】:

    您的 JKS 是否包含整个链?如果你往里看,你有没有一直到根证书的整个链条?

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

    查看类似的 Stackoverflow 问题:CamelJettyWebSocketServer, fatal error: 42: null cert chain

    【讨论】:

    • 谢谢。是的,它是自签名的。将检查整个链的证书
    • 我发现它只有证书,没有链和受信任的根。谢谢
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多