近期在对接一个HTTP接口时,遇到了报错 sun.security.validator.ValidatorException: PKIX path building。经过查询得知,该接口网站所使用的是Let’s Encrypt证书。尽管目前主流浏览器已经信任Let’s Encrypt证书,但对于一些老版本的Java仍可能出现不兼容情况。

检查是否兼容Let证书

在Main方法执行以下代码:

new URL("https://helloworld.letsencrypt.org").openConnection().connect();

然后查看是否抛出以下异常即可:

sun.security.validator.ValidatorException: PKIX path building

获取当前Java版本

因 Let’s Encrypt 证书较新,下列 JDK/JRE 旧版本会不信任 Let’s Encrypt 证书

Java 7 < 7u111
Java 8 < 8u101

可以通以下代码进行查询:

String javaVersion = System.getProperty("java.version");
String updateString = javaVersion.split("_")[1]; // 假设格式是1.8.0_XXX
int updateNumber = Integer.parseInt(updateString);
// 如果是Java7 这里更换为 111即可
if (updateNumber >= 101) {
    System.out.println("Java版本大于或等于8u101");
} else {
    System.out.println("Java版本小于8u101");
}

解决方法

获取最新版本:传送

选择项目结构,添加刚刚下载的SDK,接着在项目里面选择最新的SDK即可

检查是否成功

重复操作上述 检查 Java 环境是否兼容 Let’s Encrypt 证书 的内容即可。