? ? ? ? 在Java項目中請求HTTPS時,可能會遇到 "unable to find valid certification path to requested target" 錯誤。這個錯誤通常是由于SSL證書問題引起的。要解決此問題,可以嘗試以下方法
1.忽略SSL驗證
????????OkHttpClient封裝請求
public static OkHttpClient getUnsafeOkHttpClient() {
try {
// 創(chuàng)建一個信任所有證書的TrustManager
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
// 創(chuàng)建一個不驗證證書的 SSLContext,并使用上面的TrustManager初始化
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// 使用上面創(chuàng)建的SSLContext創(chuàng)建一個SSLSocketFactory
javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
builder.hostnameVerifier((hostname, session) -> true);
builder.readTimeout(1, TimeUnit.MINUTES);
return builder.build();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) throws Exception {
// 發(fā)送請求
Request request = new Request.Builder()
.url("https://example.com")
.build();
Response response = getUnsafeOkHttpClient().newCall(request).execute();
System.out.println(response.body().string());
}
????????CloseableHttpClient請求
public static void main(String[] args) throws Exception {
// 創(chuàng)建SSL上下文,忽略證書驗證
SSLContextBuilder sslContextBuilder = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true);
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), NoopHostnameVerifier.INSTANCE);
// 創(chuàng)建 CloseableHttpClient 對象
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslSocketFactory)
.build();
// 創(chuàng)建 HttpGet 對象,并設(shè)置請求URL
HttpGet httpGet = new HttpGet("https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg");
// 設(shè)置請求頭參數(shù)
httpGet.setHeader("User-Agent", "Mozilla/5.0");
// 發(fā)送請求,獲取響應
HttpResponse response = httpClient.execute(httpGet);
// 獲取響應實體
HttpEntity entity = response.getEntity();
// 讀取響應內(nèi)容
String responseBody = EntityUtils.toString(entity);
// 輸出響應
System.out.println("Response Code: " + response.getStatusLine().getStatusCode());
System.out.println("Response Body: " + responseBody);
// 關(guān)閉httpClient
httpClient.close();
}
? ? ? ? HttpURLConnection請求
//忽略SSL驗證
public static void ignoreSSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}};
sslContext.init(null, trustManagers, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}
public static void main(String[] args) throws Exception {
ignoreSSL();
// 創(chuàng)建URL對象
URL url = new URL("https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg");
// 打開連接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 設(shè)置請求頭參數(shù)
connection.setRequestMethod("GET");
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
// 發(fā)送請求
int responseCode = connection.getResponseCode();
// 讀取響應
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 輸出響應
System.out.println("Response Code: " + responseCode);
System.out.println("Response Body: " + response.toString());
// 關(guān)閉連接
connection.disconnect();
}
????????RestTemplate請求
public static void ignoreSSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}};
sslContext.init(null, trustManagers, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
}
public static void main(String str[]) throws Exception{
ignoreSSL();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity("https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg", String.class);
System.out.println(response.getBody());
}
2.添加證書到本地證書庫
-
獲取證書,首先確保您訪問的HTTPS網(wǎng)站具有有效的SSL證書??梢酝ㄟ^瀏覽器訪問該網(wǎng)站并查看并導出證書。
?文章來源:http://www.zghlxwxcb.cn/news/detail-719451.html
-
導入SSL證書:將SSL證書導入到Java的信任存儲庫中??梢允褂胟eytool命令行工具執(zhí)行此操作。運行以下命令將證書導入到默認的JDK信任存儲庫中文章來源地址http://www.zghlxwxcb.cn/news/detail-719451.html
-
keytool -import -alias alias_name -keystore path_to_jdk_cacerts -file path_to_certificate -- alias_name 證書指定的別名 -- path_to_jdk_cacerts是JDK信任存儲庫的路徑,默認路徑為$JAVA_HOME/jre/lib/security/cacerts, -- path_to_certificate是下載的SSL證書的路徑
到了這里,關(guān)于https請求報錯unable to find valid certification path to requested target解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!