PKIX 路径构建失败:无法找到请求目标的有效证书路径 - 导入的 CERT
PKIX path building failed: unable to find valid certification path to requested target - imported CERT
我正在尝试通过 REST API 在站点上使用获取请求。但是 link 访问它是一个 IP 地址,我得到:
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
当我在浏览器中使用完全相同的 link 时,它起作用了。
我该如何解决这个问题?
下面是我的代码:
public static void main(String[] args) {
System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "socksProxyHost", "xxx.xxx.xxx.xxx" );
System.getProperties().put( "socksProxyPort", "xxxx" );
URL requestLink = ismTicketManager.UrlEncode.convertToURLEscapingIllegalCharacters("https://xx.xx.xx.xx/e/528f5016-6fd9-403f-85e4-5a54bb2498b9/api/v1/problem/feed?relativeTime=30mins&Api-Token=xxxxx");
try {
HttpURLConnection targetConn = (HttpURLConnection)requestLink.openConnection();
targetConn.setRequestMethod("GET");
System.out.println(targetConn.getResponseCode());
} catch (Exception e) {
e.printStackTrace();
System.out.println("Connection failed");
}
static {
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("127.0.0.1"));
}
}
我从 firefox 导出了证书并将其导入到 cacerts 文件中:
cacerts 文件列表如下所示:
restapi,2018 年 9 月 25 日,trustedCertEntry,
证书指纹 (SHA1):AB:6D:C6:2E:9F:B3:D9:48:1E:A9:84:AA:DD:03:64:1D:7C:08:42:CE
我该如何解决这个问题?
编辑:感谢 Guillaume 解决了问题。
我的问题是我有程序 files/JDK 和程序 files/JRE。我正在导入 JDK 中的 cacerts 文件,而 eclipse 使用的是 JRE。这是通过 -Djavax.net.debug=ssl VM 参数发现的。
还有IP在:
static {
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("10.31.17.38"));
}
应该等于我正在使用的变量 requestLink 中的那个。事实上,当我没有这样做时,我得到了一个错误,准确地告诉我。
可能是网站没有发送完整的证书路径(包括根)。
尝试添加此 VM 选项:-Dcom.sun.security.enableAIAcaIssuers=true
从命令行启动 Java 程序时,您的命令应如下所示(如 Oracle doc 中所述)
java -Dcom.sun.security.enableAIAcaIssuers=true <Main Class>
从 Eclipse 启动时,应在 "VM Arguments:"
下添加该选项
我正在尝试通过 REST API 在站点上使用获取请求。但是 link 访问它是一个 IP 地址,我得到:
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
当我在浏览器中使用完全相同的 link 时,它起作用了。
我该如何解决这个问题?
下面是我的代码:
public static void main(String[] args) {
System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "socksProxyHost", "xxx.xxx.xxx.xxx" );
System.getProperties().put( "socksProxyPort", "xxxx" );
URL requestLink = ismTicketManager.UrlEncode.convertToURLEscapingIllegalCharacters("https://xx.xx.xx.xx/e/528f5016-6fd9-403f-85e4-5a54bb2498b9/api/v1/problem/feed?relativeTime=30mins&Api-Token=xxxxx");
try {
HttpURLConnection targetConn = (HttpURLConnection)requestLink.openConnection();
targetConn.setRequestMethod("GET");
System.out.println(targetConn.getResponseCode());
} catch (Exception e) {
e.printStackTrace();
System.out.println("Connection failed");
}
static {
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("127.0.0.1"));
}
}
我从 firefox 导出了证书并将其导入到 cacerts 文件中: cacerts 文件列表如下所示:
restapi,2018 年 9 月 25 日,trustedCertEntry, 证书指纹 (SHA1):AB:6D:C6:2E:9F:B3:D9:48:1E:A9:84:AA:DD:03:64:1D:7C:08:42:CE
我该如何解决这个问题?
编辑:感谢 Guillaume 解决了问题。 我的问题是我有程序 files/JDK 和程序 files/JRE。我正在导入 JDK 中的 cacerts 文件,而 eclipse 使用的是 JRE。这是通过 -Djavax.net.debug=ssl VM 参数发现的。
还有IP在:
static {
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("10.31.17.38"));
}
应该等于我正在使用的变量 requestLink 中的那个。事实上,当我没有这样做时,我得到了一个错误,准确地告诉我。
可能是网站没有发送完整的证书路径(包括根)。
尝试添加此 VM 选项:-Dcom.sun.security.enableAIAcaIssuers=true
从命令行启动 Java 程序时,您的命令应如下所示(如 Oracle doc 中所述)
java -Dcom.sun.security.enableAIAcaIssuers=true <Main Class>
从 Eclipse 启动时,应在 "VM Arguments:"
下添加该选项