gpt4 book ai didi

java - Java 6/7 中的 HTTPURL 连接

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:02 24 4
gpt4 key购买 nike

我有一个带有 HTTPURL 连接的 java 代码,它一直说如下错误,并在第 47 行指出错误。

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target|

它还在第 47 行显示错误:OutputStream output = httpURLConnection.getOutputStream();

无法跟踪 url 响应代码,你的 url 可以访问。

这里是堆栈跟踪和 javacode

https://gist.github.com/theakathir/c9138e3ea7470b698ec06a7db7dcdeab

如果有人可以协助解决此问题,我们将不胜感激。谢谢

最佳答案

服务器的域证书通常由中间证书颁发机构签名,而中间证书颁发机构又由根证书颁发机构签名。所有常见客户端(浏览器 - chrome、mozilla、internet-explorer、safari、opera 和 java-vm)都有自己的信任库,在安装过程中已经绑定(bind)了证书颁发机构。

异常意味着您指向的服务器的服务器证书尚未由 jvm 信任的证书颁发机构签名。

在这种情况下,您通常会构建自己的信任管理器,而不是修改 jvm 的默认信任库(位于 $JAVA_HOME\jre\lib\security\cacerts)。

代码片段看起来像这样:

package com.example.so.tls;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;


/**
* <p> https://stackoverflow.com/q/44607949/2862341 </p>
* @author ravindra
*/
public class TestCustomTruststore {

public static void main(String[] args) {

String pathToTruststore = "/path/to/customTruststore.jks"; // truststore has the server certificate loaded
try {
File file = new File(pathToTruststore);
KeyStore trustStore = KeyStore.getInstance("jks");
trustStore.load(new FileInputStream(file), null);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init(trustStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

String urlStr = "https://example.com";
URL url = new URL(urlStr);
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
httpsURLConnection.setSSLSocketFactory(sslSocketFactory);

httpsURLConnection.getInputStream();

} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}


}

}

PS:您需要使用 $JAVA_HOME\bin\keytool 实用程序来创建 keystore 并加载证书。

关于java - Java 6/7 中的 HTTPURL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44607949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com