Web服务提供者和消费者之间的证书机制
certificate mechanism between webservice provider and consumer
服务器和客户端在 web 服务调用中放置 ssl 证书机制的具体步骤是什么?谁(client/server/both)将生成 .keystore、.p7b/.cer 文件?我用谷歌搜索了很多但找不到答案。
在我的例子中,我是客户端 运行 一个使用 soap webservice 调用的 java 应用程序。我有一个由 WebService 提供商提供的 .p7b 文件。我知道在哪里放置文件(.keystore、.cer)以及如何在应用程序中使用它。
但是,我的问题是
- 我需要生成密钥库文件还是应该从
网络服务提供商?如果我需要生成,如何生成?我需要私人吗
key/passphrase?
- 我需要一个 .cer 文件,那么如何使用 keytool 将 .p7b 转换为 .cer
文件?
提前感谢您的帮助。
您似乎正在调用一个 Web 服务,其中的 HTTP 连接受到 TLS/SSL 使用 X509 证书的保护。这意味着服务器已经使用这些证书以及相应的私钥设置了一个密钥库。当您调用 Web 服务时,服务器将从其密钥库中检索用于建立信任(即保护与 Web 服务的 TLS 连接)的证书并将其发送给客户端。当客户端收到来自服务器的响应时,它将检查该证书的信任度。现在我们有两种情况:
如果服务器使用 self-signed 证书(可用于开发和测试,但不能用于生产),则客户端不会将其识别为受信任的,因为它未存储在客户的信任库中。默认情况下,在 Java 环境中,会在以下两个位置(按顺序)搜索信任库:$JAVA_HOME/lib/security/jssecacerts
和 $JAVA_HOME/lib/security/cacerts
。 运行 具有 -Djavax.net.ssl.trustStore
and -Djavax.net.ssl.trustStorePassword
or by using a custom TrustManager
. As such, if the server self-signed certificate is not stored in one of these locations, the secure connection will fail. So the client will have to import the certificate into its truststore. To circumvent the import of self-signed certificates into the client's truststore, you can create a custom X509TrustManager
as stated here 的客户端也可以使用自定义信任库。
如果服务器使用由公认的根 CA 机构之一签署的证书,那么它会被自动验证,因为这些 CA 的证书已经安装在 Java 的默认信任库中.因此,受信任的 TLS 连接将成功。
在服务器不需要客户端身份验证的情况下,该过程结束(这是通过浏览器连接到大多数 HTTPS 网站时发生的情况)。
如果服务器需要客户端身份验证,则客户端需要将其密钥库中的证书提供给服务器,而服务器需要将其安装在其信任库中。 Web 服务提供商必须向客户端提供客户端应使用的证书配置文件的规范。
Here 您可以找到对密钥库与信任库术语的很好的解释。
By default in Java environments, keystores and truststores are JKS files.
所以你是说你有一个由网络服务提供商提供的 .p7b 文件。引用自 this 页:
PKCS#7/P7B Format
The PKCS#7 or P7B format is usually stored in Base64 ASCII format and has a file extention of .p7b or .p7c. P7B certificates contain "-----BEGIN PKCS7-----" and "-----END PKCS7-----" statements. A P7B file only contains certificates and chain certificates, not the private key. Several platforms support P7B files including Microsoft Windows and Java Tomcat.
因此 P7B 文件包含服务器证书或证书链(更多关于此 here)。
我相信您处于 no-client-auth 场景中。因此,您不需要自己的密钥库。您只需将服务器的证书(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
如果实际上需要客户端身份验证,那么您需要使用您的私钥和 public 证书创建您的密钥库,并通过 -Djavax.net.ssl.keyStore
and -Djavax.net.ssl.keyStorePassword
parameters 或通过KeyManager
。之前解释的相同工作流程现在适用于相反的方向。
服务器和客户端在 web 服务调用中放置 ssl 证书机制的具体步骤是什么?谁(client/server/both)将生成 .keystore、.p7b/.cer 文件?我用谷歌搜索了很多但找不到答案。 在我的例子中,我是客户端 运行 一个使用 soap webservice 调用的 java 应用程序。我有一个由 WebService 提供商提供的 .p7b 文件。我知道在哪里放置文件(.keystore、.cer)以及如何在应用程序中使用它。
但是,我的问题是
- 我需要生成密钥库文件还是应该从 网络服务提供商?如果我需要生成,如何生成?我需要私人吗 key/passphrase?
- 我需要一个 .cer 文件,那么如何使用 keytool 将 .p7b 转换为 .cer 文件?
提前感谢您的帮助。
您似乎正在调用一个 Web 服务,其中的 HTTP 连接受到 TLS/SSL 使用 X509 证书的保护。这意味着服务器已经使用这些证书以及相应的私钥设置了一个密钥库。当您调用 Web 服务时,服务器将从其密钥库中检索用于建立信任(即保护与 Web 服务的 TLS 连接)的证书并将其发送给客户端。当客户端收到来自服务器的响应时,它将检查该证书的信任度。现在我们有两种情况:
如果服务器使用 self-signed 证书(可用于开发和测试,但不能用于生产),则客户端不会将其识别为受信任的,因为它未存储在客户的信任库中。默认情况下,在 Java 环境中,会在以下两个位置(按顺序)搜索信任库:
$JAVA_HOME/lib/security/jssecacerts
和$JAVA_HOME/lib/security/cacerts
。 运行 具有-Djavax.net.ssl.trustStore
and-Djavax.net.ssl.trustStorePassword
or by using a customTrustManager
. As such, if the server self-signed certificate is not stored in one of these locations, the secure connection will fail. So the client will have to import the certificate into its truststore. To circumvent the import of self-signed certificates into the client's truststore, you can create a customX509TrustManager
as stated here 的客户端也可以使用自定义信任库。如果服务器使用由公认的根 CA 机构之一签署的证书,那么它会被自动验证,因为这些 CA 的证书已经安装在 Java 的默认信任库中.因此,受信任的 TLS 连接将成功。
在服务器不需要客户端身份验证的情况下,该过程结束(这是通过浏览器连接到大多数 HTTPS 网站时发生的情况)。
如果服务器需要客户端身份验证,则客户端需要将其密钥库中的证书提供给服务器,而服务器需要将其安装在其信任库中。 Web 服务提供商必须向客户端提供客户端应使用的证书配置文件的规范。
Here 您可以找到对密钥库与信任库术语的很好的解释。
By default in Java environments, keystores and truststores are JKS files.
所以你是说你有一个由网络服务提供商提供的 .p7b 文件。引用自 this 页:
PKCS#7/P7B Format
The PKCS#7 or P7B format is usually stored in Base64 ASCII format and has a file extention of .p7b or .p7c. P7B certificates contain "-----BEGIN PKCS7-----" and "-----END PKCS7-----" statements. A P7B file only contains certificates and chain certificates, not the private key. Several platforms support P7B files including Microsoft Windows and Java Tomcat.
因此 P7B 文件包含服务器证书或证书链(更多关于此 here)。
我相信您处于 no-client-auth 场景中。因此,您不需要自己的密钥库。您只需将服务器的证书(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
如果实际上需要客户端身份验证,那么您需要使用您的私钥和 public 证书创建您的密钥库,并通过 -Djavax.net.ssl.keyStore
and -Djavax.net.ssl.keyStorePassword
parameters 或通过KeyManager
。之前解释的相同工作流程现在适用于相反的方向。