【发布时间】:2014-09-24 21:15:38
【问题描述】:
我收到以下错误
sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到所请求目标的有效证书路径
连接到谷歌地图地理编码 API 时。 我能够在一个简单的主程序中重现该错误。以下是使用此测试程序重现它的方法:
import javax.net.ssl.*;
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
String httpsURL = "https://maps.googleapis.com/maps/api/geocode/json?address=49+874%2Cla+plata%2Cbuenos+aires%2Cargentina&sensor=false&key=AIzaSyAJ1QS0C6KjiWajwxx4jUb_Jz0b8lBZyyE";
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
InputStream ins = con.getInputStream();
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();
} catch (IOException ex) {
System.err.println(ex.getMessage());
}
}
}
另存为 Main.java 编译它
javac Main.java
运行它
java Main
我得到了正常的结果(打印了 json 响应)。
但是,如果我使用此处的证书创建 TrustStore: https://www.clic.gob.ar/ 我下载了 SSL 证书并将其保存为名为 clic.gob.ar 的 X.509 PEM 文件
创建一个名为 keystorefede.jks 的新 TrustStore
keytool -import -file clic.gob.ar -alias clicCert -keystore keystorefede.jks
我给了它密码 tompass。我可以列出来
keytool -list -keystore keystorefede.jks -storepass tompass
Tipo de Almacén de Claves:JKS Proveedor de Almacén de Claves:太阳
Su almacén de claves contiene 1 entrada
cliccert,2014 年 1 月 8 日,trustedCertEntry, Huella 数字证书 (SHA1):15:3B:67:EE:51:C9:F2:CF:68:7C:24:51:A4:B6:6E:AE:EA:61:D5:B5
现在使用 trustStore 运行相同的程序
java -Djavax.net.ssl.trustStore=/home/fede/keystorefede.jks -Djavax.net.ssl.trustStorePassword=tompass Main
sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
Java 8 和 Java 7 都会出现这种情况。
java 版本“1.8.0_11”
Java(TM) SE 运行时环境(内部版本 1.8.0_11-b12)
Java HotSpot(TM) 64 位服务器 VM(内部版本 25.11-b03,混合模式)
该问题最初是在 Tomcat 中运行的 Web 应用程序中发现的。证书必须在 Tomcat 命令行中的 TrustStore 中才能进行另一个请求;信任库与谷歌没有任何关系,只有一个证书。 如果我将 Google 的证书添加到信任库,那么问题就解决了,但这不是一个正确的解决方案。 Google 不接受使用 API 密钥通过 http 进行的地理编码请求。 覆盖所有根 CA 的 Java 的 -Djavax.net.ssl.trustStore 知道吗?
【问题讨论】: