看起来您正在使用X509证书调用HTTP连接受TLS / SSL保护的Web服务.这意味着服务器已经设置了具有这些证书的密钥库以及相应的私钥.当您调用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您可以找到对密钥库和信任库术语的一个很好的说明.
所以你说你有一个由Web服务提供商提供的.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).
我相信你是在一个没有客户端认证的场景中.因此,您不需要自己的密钥库.您只需要将服务器的证书(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将其提供给连接.之前解释的相同工作流现在适用于相反的方向.