最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中g(shù)et/post的https請(qǐng)求忽略ssl證書認(rèn)證淺析

 更新時(shí)間:2024年01月03日 08:30:26   作者:醉酒de李白  
因?yàn)镴ava在安裝的時(shí)候,會(huì)默認(rèn)導(dǎo)入某些根證書,所以有些網(wǎng)站不導(dǎo)入證書,也可以使用Java進(jìn)行訪問(wèn),這篇文章主要給大家介紹了關(guān)于Java中g(shù)et/post的https請(qǐng)求忽略ssl證書認(rèn)證的相關(guān)資料,需要的朋友可以參考下

需求

最近在負(fù)責(zé)一個(gè)對(duì)接第三方服務(wù)的事情,在對(duì)接期間,因?yàn)榈谌椒?wù)為https的請(qǐng)求,眾所周知,請(qǐng)求https請(qǐng)求會(huì)使用本地的證書公鑰去訪問(wèn)服務(wù)SSL證書,應(yīng)我本地并沒(méi)有對(duì)應(yīng)的SSL證書,所以請(qǐng)求不到服務(wù),請(qǐng)求接口時(shí)報(bào)如下錯(cuò)誤。翻閱資源發(fā)現(xiàn)是可以 忽略SSL認(rèn)證的。

  • unable to find valid certification path to requested target

工具類

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SslUtils {
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    static class miTM implements TrustManager, X509TrustManager {
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }

        @Override
        public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            return;
        }

        @Override
        public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
            return;
        }
    }

    /**
     * 忽略HTTPS請(qǐng)求的SSL證書,必須在openConnection之前調(diào)用
     *
     * @throws Exception
     */
    public static void ignoreSsl() throws Exception {
        HostnameVerifier hv = new HostnameVerifier() {
            @Override
            public boolean verify(String urlHostName, SSLSession session) {
                System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

    /**
     * 避免HttpClient的”SSLPeerUnverifiedException: peer not authenticated”異常
     * <p>
     * 不用導(dǎo)入SSL證書
     *
     * @param base
     * @return
     */
    public static HttpClient wrapClient(HttpClient base) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
                @Override
                public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
                @Override
                public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
            };
            ctx.init(null, new TrustManager[]{tm}, null);
            SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
            CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(ssf).build();
            return httpclient;
        } catch (Exception ex) {
            ex.printStackTrace();
            return HttpClients.createDefault();
        }
    }

    /**
     * 跳過(guò)證書效驗(yàn)的sslcontext
     *
     * @return
     * @throws Exception
     */
    private static SSLContext createIgnoreVerifySSL() throws Exception {
        SSLContext sc = SSLContext.getInstance("TLS");

        // 實(shí)現(xiàn)一個(gè)X509TrustManager接口,用于繞過(guò)驗(yàn)證,不用修改里面的方法
        X509TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
                                           String paramString) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
                                           String paramString) throws CertificateException {
            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        sc.init(null, new TrustManager[] { trustManager }, null);
        return sc;
    }

    /**
     * 構(gòu)造RestTemplate
     *
     * @return
     * @throws Exception
     */
    public static RestTemplate getRestTemplate() throws Exception {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        // 超時(shí)
//        factory.setConnectionRequestTimeout(5000);
//        factory.setConnectTimeout(5000);
//        factory.setReadTimeout(5000);
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(createIgnoreVerifySSL(),
                // 指定TLS版本
                null,
                // 指定算法
                null,
                // 取消域名驗(yàn)證
                new HostnameVerifier() {
                    @Override
                    public boolean verify(String string, SSLSession ssls) {
                        return true;
                    }
                });
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        factory.setHttpClient(httpClient);
        RestTemplate restTemplate = new RestTemplate(factory);
        // 解決中文亂碼問(wèn)題
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        return restTemplate;
    }
}

使用方法

 @Override
    public void completionIndexPushToODS(List<Bean> data) throws Exception {
        try {
        	//請(qǐng)求地址
            String url ="https://.....";
            //請(qǐng)求參數(shù)
            String requestData = JSON.toJSONString(data);
            System.out.println("請(qǐng)求參數(shù):" + requestData);

            RestTemplate restTemplate;
            if (flag) {
            	//HTTP繞過(guò)SSL證書認(rèn)證
                restTemplate = SslUtils.getRestTemplate();
            } else {
            	//普通請(qǐng)求方式
                restTemplate = new RestTemplate();
            }
            //自定義header傳輸信息(根據(jù)自己的需求設(shè)置)
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
            
            HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity(JSON.toJSON(data), httpHeaders);
            URI uri = new URI(url);
            System.out.println("開始請(qǐng)求");
            //POST返回字節(jié)方式
            byte[] response = restTemplate.postForObject(uri, httpEntity, byte[].class);
           	//GET請(qǐng)求返回字符
            //String request = restTemplate.getForObject(uri, String.class);

            System.out.println("請(qǐng)求結(jié)束");
            if (response == null) {
                System.out.println("返回值為空");
            }
            String result = new String(response, "utf-8");
            System.out.println("返回結(jié)果:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

總結(jié) 

到此這篇關(guān)于Java中g(shù)et/post的https請(qǐng)求忽略ssl證書認(rèn)證的文章就介紹到這了,更多相關(guān)Java https請(qǐng)求忽略ssl證書認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA模擬新增順序表及單鏈表

    JAVA模擬新增順序表及單鏈表

    這篇文章主要介紹了JAVA模擬新增順序表及單鏈表,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringCloud將Nacos作為配置中心實(shí)現(xiàn)流程詳解

    SpringCloud將Nacos作為配置中心實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Springcloud中的Nacos Config服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • SpringBoot定時(shí)任務(wù)+自定義線程池實(shí)踐

    SpringBoot定時(shí)任務(wù)+自定義線程池實(shí)踐

    文章介紹了SpringBoot中使用@Schedule注解實(shí)現(xiàn)定時(shí)任務(wù)的方法,包括四種定時(shí)任務(wù)格式和Cron表達(dá)式,同時(shí),還探討了@Schedule默認(rèn)線程池大小為1的情況及解決方案,即通過(guò)@Async注解實(shí)現(xiàn)異步處理和手動(dòng)實(shí)現(xiàn)自定義線程池進(jìn)行優(yōu)化
    2026-05-05
  • Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明

    Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明

    這篇文章主要介紹了Java--SSH,SSM和Spring?Boot框架區(qū)別及優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解

    Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理詳解

    AOP是面向切面編程的技術(shù),AOP基于IoC基礎(chǔ),是對(duì)OOP的有益補(bǔ)充,流行的AOP框架有Sping AOP、AspectJ,這篇文章主要給大家介紹了關(guān)于Spring中AOP概念與兩種動(dòng)態(tài)代理模式原理的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(22)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(22)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • SpringBoot中Filter沒(méi)有生效原因及解決方案

    SpringBoot中Filter沒(méi)有生效原因及解決方案

    Servlet 三大組件 Servlet、Filter、Listener 在傳統(tǒng)項(xiàng)目中需要在 web.xml 中進(jìn)行相應(yīng)的配置,這篇文章主要介紹了SpringBoot中Filter沒(méi)有生效原因及解決方案,需要的朋友可以參考下
    2024-04-04
  • SpringBoot生產(chǎn)環(huán)境打包如何去除無(wú)用依賴

    SpringBoot生產(chǎn)環(huán)境打包如何去除無(wú)用依賴

    這篇文章主要介紹了SpringBoot生產(chǎn)環(huán)境打包如何去除無(wú)用依賴問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java中SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法

    Java中SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法

    這篇文章主要介紹了 SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Java實(shí)現(xiàn)Excel導(dǎo)出并添加水印

    Java實(shí)現(xiàn)Excel導(dǎo)出并添加水印

    這篇文章主要為大家詳細(xì)介紹了Java如何使用poi-ooxml包導(dǎo)出xlsx添加水印,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11

最新評(píng)論

石首市| 峨边| 宿松县| 和平区| 中方县| 嘉义县| 牡丹江市| 富民县| 雷山县| 耒阳市| 琼海市| 鹤庆县| 五指山市| 蓬溪县| 胶南市| 萍乡市| 拜泉县| 墨江| 大名县| 泸西县| 龙山县| 竹溪县| 靖州| 金川县| 鄂托克前旗| 特克斯县| 明星| 诸城市| 越西县| 北安市| 巴东县| 尼勒克县| 宝丰县| 昌都县| 肇州县| 浠水县| 普定县| 托里县| 无为县| 原阳县| 漳浦县|