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-12Java項(xiàng)目啟動(dòng)成功、失敗信息實(shí)時(shí)反饋提醒問題(郵件或者短信)
這篇文章主要介紹了Java項(xiàng)目啟動(dòng)成功、失敗信息實(shí)時(shí)反饋提醒問題(郵件或者短信),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式
這篇文章主要介紹了String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Spring?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