Java跳過證書訪問HTTPS詳細(xì)代碼示例
前言
java直接發(fā)送請(qǐng)求訪問https地址的時(shí)候,若沒有導(dǎo)入證書,會(huì)出現(xiàn)各種問題,如307。
以下會(huì)以是否SpringBoot來解決這個(gè)問題,做法一致,都是繞過證書進(jìn)行處理的。
一,非Spring方式
創(chuàng)建一個(gè)請(qǐng)求代理類,為所有的HTTPS請(qǐng)求訪問前做一下操作
public class IgnoreHttpsProxyRequest {
/**
* 通過HTTPS的url登錄
* @param urlStr 目標(biāo)url
* @return 查詢結(jié)果
* @throws IOException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public String get(String urlStr, String token, String type) throws IOException, NoSuchAlgorithmException, KeyManagementException {
//繞過https
HttpsURLConnection.setDefaultHostnameVerifier(new IgnoreHttpsProxyRequest().new NullHostNameVerifier());
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagers, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
//建立連接
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(type);
connection.setRequestProperty(HttpHeaders.AUTHORIZATION, "Bearer " + token);
connection.connect();
//獲取查詢結(jié)果
InputStream inputStream = connection.getInputStream();
if (inputStream == null) {
return null;
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String tmp = null;
while ((tmp = bufferedReader.readLine()) != null) {
sb.append(tmp);
}
bufferedReader.close();
inputStream.close();
return sb.toString();
}
static TrustManager[] trustManagers = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
public class NullHostNameVerifier implements HostnameVerifier {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}
}
二,SpringBoot方式
先創(chuàng)建一個(gè)跳過證書驗(yàn)證,信任所有站點(diǎn)的請(qǐng)求客戶端factory
package com.foxconn.dsc.matrix.api;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
/**
* @ClassName: SkipHttpsRequestFactory
* @Description:
* @author: lemon
* @date: 2023/9/14 13:56
*/
public class SkipHttpsRequestFactory extends SimpleClientHttpRequestFactory {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
if (connection instanceof HttpsURLConnection) {
prepareHttpsConnection((HttpsURLConnection) connection);
}
super.prepareConnection(connection, httpMethod);
}
private void prepareHttpsConnection(HttpsURLConnection connection) {
connection.setHostnameVerifier(new SkipHostnameVerifier());
try {
connection.setSSLSocketFactory(createSslSocketFactory());
} catch (Exception ex) {
// Ignore
}
}
private SSLSocketFactory createSslSocketFactory() throws Exception {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[] { new SkipX509TrustManager() }, new SecureRandom());
return context.getSocketFactory();
}
private class SkipHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
}
private static class SkipX509TrustManager implements X509TrustManager {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
}
}注入RestTemplate類時(shí),構(gòu)造時(shí)將該工廠類加上。
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SkipHttpsRequestFactory();
RestTemplate restTemplate = new RestTemplate(factory);
return restTemplate;
}
使用時(shí)將其注入
@Resource private RestTemplate restTemplate;
配置完畢之后,就可以直接調(diào)用了
ResponseEntity<String> response = restTemplate.exchange(builder.build().encode().toUri(), HttpMethod.GET, entity, String.class);
總結(jié)
到此這篇關(guān)于Java跳過證書訪問HTTPS的文章就介紹到這了,更多相關(guān)Java跳過證書訪問HTTPS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java虛擬機(jī)jvm方法區(qū)實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于java虛擬機(jī)jvm方法區(qū)實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02
詳解java集成支付寶支付接口(JSP+支付寶20160912)
本篇文章主要介紹了java集成支付寶支付接口,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Java項(xiàng)目啟動(dòng)成功、失敗信息實(shí)時(shí)反饋提醒問題(郵件或者短信)
這篇文章主要介紹了Java項(xiàng)目啟動(dòng)成功、失敗信息實(shí)時(shí)反饋提醒問題(郵件或者短信),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式
這篇文章主要介紹了String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Spring?Boot集成JavaMailSender發(fā)送郵件功能的實(shí)現(xiàn)
spring提供了發(fā)送郵件的接口JavaMailSender,通過JavaMailSender可以實(shí)現(xiàn)后端發(fā)送郵件,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot集成JavaMailSender發(fā)送郵件功能的相關(guān)資料,需要的朋友可以參考下2022-05-05

