可以将 CA(客户端)颁发的证书与自签名证书(服务器)进行通信吗?

Posted

技术标签:

【中文标题】可以将 CA(客户端)颁发的证书与自签名证书(服务器)进行通信吗?【英文标题】:Can communicate a certificate issued by a CA (client) with a certificate Self Signed (server)? 【发布时间】:2018-11-29 14:36:01 【问题描述】:

我们有一个 Java Web 应用程序(客户端),它调用具有自签名证书的站点(服务器)的 Web 服务。当我们从日志文件执行调用时,我们的证书是由 CA 颁发的:

default task-24, SEND TLSv1.2 ALERT:  fatal, description = certificate_unknown
default task-24, WRITE: TLSv1.2 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 03 00 02 02 2E                               .......
default task-24, called closeSocket()
default task-24, handling exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target`enter code here`
default task-24, called close()

我们的应用服务器是Wildfly 10,我们使用Spring Ws来调用Web服务。 在我们的密钥库中有我们调用的服务器站点的自签名证书。

在出现此错误之前,我们有一个自签名证书客户端,它调用自签名证书服务器,它工作正常!

鉴于我们现在有一个 CA 颁发的证书,我们需要将新证书传递给服务器部分以便继续使用他们的网络服务?

非常感谢

【问题讨论】:

【参考方案1】:

鉴于我们现在有一个由 CA 颁发的证书[为客户端],我们是否需要将新证书传递给服务器才能继续使用他们的网络服务?

假设服务器依赖客户端证书,那么是的。

当您开始设置时,您将执行以下操作。

    为服务器创建自签名证书 为客户端创建自签名证书。 通过将服务器的证书作为受信任的证书添加到客户端的密钥库中来向客户端注册服务器(通常)。 通过将客户端的证书添加到客户端的密钥库来向服务器注册客户端(通常)。

这告诉客户端相信服务器就是它声称的那个人,并告诉服务器相信客户端就是它声称的那个人。此外,它还告诉服务器客户端“在”接受来自客户端的请求的“列表中”。

现在您已将客户端的证书更改为由适当的 CA 颁发的证书。服务器可以检查此证书是否有效,但这不足以让服务器知道客户端“在列表中”。要建立后者,您需要向服务器注册新的客户端证书,或者您需要告诉服务器接受 CA 颁发的任何客户端证书作为“列表中”。 (您需要决定哪个更适合您的用例。)

【讨论】:

我解决了,我在我们机器的文件“..jre/lib/security/jssecacert”中添加了带有整个链的证书(从 https 站点下载,这是我们调用 Web 服务的服务器) (是 WILDFLY 使用的 JRE)。在此之前,我在 server.log 中看到:“trustStore 是:/usr/lib/jdk1.8.0_111/jre/lib/security/jssecacerts”。现在我们的客户端应用程序(带有 CA 证书的站点 https)正确调用服务器的 Web 服务(具有证书自签名的第三方)早上好 但我不明白,因为在我们 WILDFLY 的standalone.xml 中,我们有一个密钥库,它没有我们称为 Web 服务的服务器的证书自签名。

以上是关于可以将 CA(客户端)颁发的证书与自签名证书(服务器)进行通信吗?的主要内容,如果未能解决你的问题,请参考以下文章

NGINX 配置 SSL 双向认证

如何获取颁发者证书的指纹或公钥?

联盟链系列 - 中间CA颁发证书

联盟链系列 - 中间CA颁发证书

联盟链系列 - 中间CA颁发证书

MacOS 上的 Chrome 停止信任自签名 CA 颁发的证书