今天跟大家唠唠嗑,说说我昨天碰到的一个糟心事儿,关于“PKIX path building failed”的。这玩意儿,我一开始看到也是一脸懵,啥玩意儿?后来吭哧吭哧一顿操作,总算是搞明白,也解决。现在就来跟大家分享一下我的踩坑经历。
事情是这样的,昨天我需要调一个https的接口,结果代码一跑起来,直接给我报个错,控制台红彤彤的一片,仔细一看,就是这个“PKIX path building failed”。当时我就纳闷,之前调的好好的,怎么突然就抽风?
赶紧上网搜,各种说法都有,什么证书问题,什么JDK版本问题,看得我眼花缭乱。不过还看不少帖子,大概知道是个什么情况。简单来说,就是我的程序在验证服务器的SSL证书的时候,出问题。可能是因为服务器的证书不受信任,或者证书链不完整之类的。
解决过程
既然知道大概原因,那就开始动手解决呗。我先是尝试最简单粗暴的方法:
- 方法一:修改代码,跳过证书验证。
网上有很多这种代码,直接复制粘贴,改几个参数就行。但是!我强烈不建议这样做!虽然这样做可以很快解决问题,但是相当于直接放弃安全验证,风险太大。就跟没穿衣服就出门一样,指不定就被谁给看。这个方法我只是用来临时测试一下,看看是不是真的是证书的问题。
- 方法二:导入证书到本地信任库。
这个方法才是正道!也是我最终采用的方案。具体步骤如下:
- 下载服务器的证书。
这个每个服务器获取方式不一样,看服务器提供方,或者自己用浏览器也能下载,保存下来,后缀名一般是.crt或者.cer。我是直接让对方提供的。
- 使用keytool工具导入证书。
keytool是JDK自带的一个证书管理工具,具体命令如下:
keytool -import -alias your_alias -keystore cacerts_path -file your_certificate_path
这里解释一下:
your_alias
:是你给这个证书起个名字,随便起,别跟已有的重复就行。cacerts_path
:是你的JDK的cacerts文件的路径。这个文件是用来存放信任的证书的。一般来说,在JDK的jre/lib/security
目录下。比如我的是:/Library/Java/JavaVirtualMachines/jdk1.8.0_*/Contents/Home/jre/lib/security/cacertsyour_certificate_path
:是你刚刚下载的证书的路径。
执行这个命令的时候,会让你输入密码,默认密码是changeit
。输完密码,再输入yes
,确认导入就行。
- 重启程序。
重新跑一下你的程序,看看是不是已经好。如果还是不行,那可能就是其他问题,比如JDK版本太低,或者服务器配置有问题等等。
总结
这回解决“PKIX path building failed”问题,让我学到不少东西。最重要的就是,遇到问题不要慌,一步一步分析,总能找到解决办法的。安全问题一定要重视,不能为方便就牺牲安全。跳过证书验证这种做法,只能用来临时测试,正式环境千万不能用。
希望我的这回分享能帮到大家,如果你们也遇到类似的问题,可以参考一下我的解决过程。每个人的情况可能不一样,具体问题还要具体分析。多尝试,多学习,总能解决的!