我需要通过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_HOME/lib/security/cacerts
。非常感谢您提供任何信息来清除这些问题!