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