服务器和客户端在Web服务调用中放置ssl证书机制的确切步骤是什么?谁(客户端/服务器/两者)将生成.keystore,.p7b / .cer文件?我google了很多但找不到答案。 就我而言,我是运行java应用程序的客户端,它使用soap webservice调用。我有一个由WebService提供者提供的.p7b文件。我知道在哪里放置文件(.keystore,.cer)以及如何在应用程序中使用它。
但是,我的问题是
提前感谢您的帮助。
答案 0 :(得分:8)
您好像正在调用一个Web服务,其中HTTP连接受到TLS / SSL使用X509证书的保护。这意味着服务器已经设置了具有这些证书的密钥库以及相应的私钥。当您调用Web服务时,服务器将从其密钥库中检索用于信任建立的证书(即,保护与Web服务的TLS连接)并将其发送到客户端。当客户端从服务器收到响应时,它将检查该证书的信任。现在我们有两种情况:
如果服务器使用自签名证书(可用于开发和测试,但不能用于生产),则客户端不会将其识别为受信任,因为它未存储在客户的信任库。默认情况下,在Java环境中,将在以下两个位置(按顺序)搜索信任库:$JAVA_HOME/lib/security/jssecacerts
和$JAVA_HOME/lib/security/cacerts
。通过-Djavax.net.ssl.trustStore
and -Djavax.net.ssl.trustStorePassword
或使用自定义TrustManager
运行客户端,也可以使用自定义信任库。因此,如果服务器自签名证书未存储在其中一个位置,则安全连接将失败。因此,客户端必须将证书导入其信任库。为了避免将自签名证书导入客户的信任库,您可以按照here创建自定义X509TrustManager
。
如果服务器使用由其中一个已识别的根CA权限签名的证书,则它将自动验证,因为这些CA的证书已经安装在Java的默认信任库中。因此,可信赖的TLS连接将成功。
如果服务器不需要客户端身份验证,则该过程结束(当您通过浏览器连接到大多数HTTPS网站时会发生这种情况)。
如果服务器需要客户端身份验证,则客户端需要将其自己的证书从其密钥库提供给服务器,并且服务器需要将其安装在其信任库中。 Web服务提供商必须向客户端提供客户端应使用的证书配置文件的规范。
Here您可以找到对密钥库与信任库术语的良好说明。
By default in Java environments, keystores and truststores are JKS files
因此,您说您有一个由Web服务提供商提供的.p7b文件。从this页面引用:
PKCS#7 / P7B格式
PKCS#7或P7B格式通常以Base64 ASCII格式存储,文件扩展名为.p7b或.p7c。 P7B证书包含" ----- BEGIN PKCS7 -----"和" -----结束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或{{1}将其提供给连接}。之前解释的相同工作流现在适用于相反的方向。