Java默认密钥库和SSL握手

时间:2018-09-23 12:07:43

标签: java ssl https proxy ssl-certificate

我需要通过SSL代理通过Web服务访问,并且代理使用从第三方发行的证书。我已将证书文件(PEM格式,包含2个证书)导入

$JAVA_HOME/lib/security/cacerts 

keystore和Dockerfile在我的keytool中,一切正常。但是,如果我想使用/tmp/mykeystore.jks之类的自定义密钥库,则会收到SSL握手异常

cause javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to 
find valid certification path to requested target

当然,我会根据想要使用的密钥库来调整java选项:

-Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts

还将cert文件本身旁边的cacerts密钥库的内容也导入到自定义密钥库即可解决此问题,看来,由于我的应用程序在docker容器中运行,因此在docker容器中存在一种预加载的受信任的颁发者及其公钥cacerts我组织中的容器的密钥库。如果我仅导入证书链,则由于cacerts密钥库中存在的定制密钥库中缺少发行者,因此无法验证。但是,这给我带来了两个问题,如果有人可以提供一些见解,我将不胜感激:

  • 使用RestTemplate或任何其他http客户端在Java中执行请求时, -Djavax.net.ssl.trustStore=$JAVA_HOME/lib/security/cacerts足以向Java RestTemplate对象声明以将该文件的内容用作可信内容,还是在我初始化RestTemplate时以编程方式显式定义此内容?
  • 如果我未指定要使用的密钥库,是否有默认密钥库?我怀疑Java然后使用了$JAVA_HOME/lib/security/cacerts

非常感谢您提供任何信息来清除这些问题!

0 个答案:

没有答案