使用Fabric8 Maven部署SpringBoot应用遇PKIX证书路径错误
我之前在使用Fabric8 Maven插件部署Spring Boot应用到OpenShift时,也碰到过一模一样的问题——明明已经把集群证书导入了JVM的cacerts,结果还是报PKIX path building failed的错误。折腾了半天,发现大概率是这几个细节没处理到位,你可以逐一排查:
1. 确认Maven用的是你导入证书的那个JDK
很多人电脑上会装多个JDK/JRE,Maven默认使用的可能不是你手动添加证书的那一个。你可以先执行:
mvn -version
看输出里的Java version对应的JDK路径,比如:
Java version: 1.8.0_301, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_301\jre
然后检查这个路径下的jre/lib/security/cacerts里有没有你添加的rootcert证书。如果没有,要么把证书导入到这个JDK的cacerts里,要么修改Maven的配置或者系统环境变量,让Maven使用你已经导入证书的JDK。
2. 确保证书导入的是正确的cacerts文件
你之前的keytool命令里只写了-keystore cacerts,如果当时的工作目录不是JDK的jre/lib/security文件夹,那你可能把证书导入到了当前目录的一个新cacerts文件里,而不是JVM默认的那个。
正确的做法是指定cacerts的完整路径,比如:
keytool -import -alias rootcert -file C:\sample\RootCert.cer -keystore "C:\path\to\your\jdk\jre\lib\security\cacerts"
输入密码的时候,默认的cacerts密码是changeit,别输错了。
3. 给Maven命令手动指定信任存储
有时候Fabric8插件会忽略JVM的默认信任配置,你可以在执行部署命令时直接指定信任存储的路径和密码,强制插件使用你导入证书的cacerts:
mvn fabric8:deploy -Djavax.net.ssl.trustStore="C:\path\to\your\jdk\jre\lib\security\cacerts" -Djavax.net.ssl.trustStorePassword=changeit
如果不想每次都输这么长的参数,也可以把这些配置加到Maven的settings.xml里的一个profile中:
<profile> <id>fabric8-ssl-fix</id> <properties> <javax.net.ssl.trustStore>C:\path\to\your\jdk\jre\lib\security\cacerts</javax.net.ssl.trustStore> <javax.net.ssl.trustStorePassword>changeit</javax.net.ssl.trustStorePassword> </properties> </profile>
之后部署时只需要激活这个profile就行:
mvn fabric8:deploy -P fabric8-ssl-fix
4. 检查导入的证书是否完整有效
有时候从WebConsole下载的证书可能不是完整的根CA证书,或者缺少中间证书。你可以用浏览器访问OpenShift的API地址(比如https://api.your-cluster-domain.com:6443),查看证书链,确认你导入的是最顶层的根CA证书。
如果还是有问题,也可以用openssl命令导出集群的完整证书链,再提取根证书导入:
openssl s_client -connect api.your-cluster-domain.com:6443 -showcerts > cluster-cert-chain.pem
打开生成的cluster-cert-chain.pem文件,找到标记为BEGIN CERTIFICATE和END CERTIFICATE的根证书部分,保存成单独的.cer文件后再用keytool导入。
按照上面的步骤排查下来,应该就能解决这个SSL握手的问题了。
内容的提问来源于stack exchange,提问作者jack

