Web服务提供者和消费者之间的证书机制

Posted

技术标签:

【中文标题】Web服务提供者和消费者之间的证书机制【英文标题】:certificate mechanism between webservice provider and consumer 【发布时间】:2016-04-11 01:41:28 【问题描述】:

服务器和客户端在 web 服务调用中放置 ssl 证书机制的具体步骤是什么?谁(客户端/服务器/两者)将生成 .keystore、.p7b/.cer 文件?我用谷歌搜索了很多,但找不到答案。 就我而言,我是运行 java 应用程序的客户端,该应用程序消耗了一个肥皂网络服务调用。我有一个由 WebService 提供商提供的 .p7b 文件。我知道在哪里放置文件(.keystore、.cer)以及如何在应用程序中使用它。

但是,我的问题是

    我需要生成密钥库文件还是应该从 网络服务提供商?如果我需要生成,如何生成?我需要私人的吗 密钥/密码? 我需要一个 .cer 文件,那么如何使用 keytool 将 .p7b 转换为 .cer 文件?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您正在调用一个 Web 服务,其中 HTTP 连接使用 X509 证书受 TLS/SSL 保护。这意味着服务器已经使用这些证书以及相应的私钥设置了一个密钥库。当您调用 Web 服务时,服务器将从其密钥库中检索用于建立信任(即保护与 Web 服务的 TLS 连接)的证书并将其发送给客户端。当客户端收到来自服务器的响应时,它将检查该证书的信任。现在我们有两种情况:

    如果服务器使用自签名证书(可用于开发和测试,但不能用于生产),则客户端不会将其识别为受信任,因为它未存储在客户端的信任库中。默认情况下,在 Java 环境中,将在以下两个位置(按顺序)搜索信任库:$JAVA_HOME/lib/security/jssecacerts $JAVA_HOME/lib/security/cacerts。也可以通过使用-Djavax.net.ssl.trustStore and -Djavax.net.ssl.trustStorePassword 运行客户端或使用自定义TrustManager 来使用自定义信任库。因此,如果服务器自签名证书未存储在这些位置之一,则安全连接将失败。因此客户端必须将证书导入其信任库。为了避免将自签名证书导入客户端的信任库,您可以创建自定义 X509TrustManager,如 here 所述。

    如果服务器使用由公认的根 CA 授权机构之一签署的证书,那么它将自动验证,因为这些 CA 的证书已安装在 Java 的默认信任库中。这样,受信任的 TLS 连接就会成功。

在服务器不需要客户端身份验证的情况下,该过程结束(当您通过浏览器连接到大多数 HTTPS 网站时会发生这种情况)。

如果服务器需要客户端身份验证,则客户端需要从其密钥库向服务器提供自己的证书,并且服务器需要将其安装在其信任库中。 Web 服务提供商必须向客户端提供客户端应使用的证书配置文件的规范。

Here 你可以很好地解释密钥库与信任库的术语。

By default in Java environments, keystores and truststores are JKS files.

所以你说你有一个由网络服务提供商提供的 .p7b 文件。引自this页面:

PKCS#7/P7B 格式

PKCS#7 或 P7B 格式通常以 Base64 ASCII 格式存储,文件扩展名为 .p7b 或 .p7c。 P7B 证书包含“-----BEGIN PKCS7-----”和“-----END PKCS7-----”语句。 P7B 文件只包含证书和链证书,不包含私钥。多个平台支持 P7B 文件,包括 Microsoft Windows 和 Java Tomcat。

这样 P7B 文件就包含了服务器证书或证书链(更多关于这个here)。

我相信您处于无客户端身份验证的情况。因此,您不需要自己的密钥库。您只需要将服务器的证书(P7B 文件)导入您正在使用的信任库。您可以直接导入 P7B 文件而无需将其转换为 CER 格式:

keytool -import -trustcacerts -alias web_service -keystore my_truststore.jks -file web_service.p7b

如果您仍需要 CER 格式的证书,您可以像这样从 P7B 转换为 CER(回答您的第二个问题):

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

如果实际上需要客户端身份验证,那么您需要使用您的私钥和公共证书创建您的密钥库,并通过-Djavax.net.ssl.keyStore and -Djavax.net.ssl.keyStorePassword parameters 或通过KeyManager 将其提供给连接。之前解释的相同工作流程现在适用于相反的方向。

【讨论】:

不客气@Hello。不要忘记将赏金分配给我的答案。 :)

以上是关于Web服务提供者和消费者之间的证书机制的主要内容,如果未能解决你的问题,请参考以下文章

springCloud:微服务的注册与发现(Eureka)

比较和对比 REST 和 SOAP Web 服务? [复制]

dubbo服务调用是阻塞的吗

dubbo原理和机制是啥?

容错机制和熔断(Hystrix)

Dubbo中服务消费者和服务提供者之间的请求和响应过程