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

使用RestTemplate調(diào)用https接口跳過(guò)證書(shū)驗(yàn)證

 更新時(shí)間:2021年10月29日 11:23:20   作者:liangblog  
這篇文章主要介紹了使用RestTemplate調(diào)用https接口跳過(guò)證書(shū)驗(yàn)證,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

RestTemplate調(diào)用https接口跳過(guò)證書(shū)驗(yàn)證

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; 
import java.nio.charset.StandardCharsets;
import java.security.cert.CertificateException; 
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; 
public class NoHttpsClientUtils {
 
    /**
     * 跳過(guò)證書(shū)效驗(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;
    }
}

RestTemplate訪問(wèn)https遇到SSL證書(shū)驗(yàn)證錯(cuò)誤

今天,遇到了一個(gè)SSL證書(shū)認(rèn)證的問(wèn)題,糾結(jié)了好久才解決,學(xué)到了很多東西,記錄下來(lái),分享給大家。

首先說(shuō)一下大概的背景,我們的項(xiàng)目對(duì)接了第三方接口,需要向?qū)Ψ桨l(fā)送https請(qǐng)求。那么問(wèn)題來(lái)了,https請(qǐng)求時(shí)需要通過(guò)SSL證書(shū)認(rèn)證的,今天流程突然走不下去了,看日志發(fā)現(xiàn)是SSL認(rèn)證的問(wèn)題:

在網(wǎng)上找資料,解決問(wèn)題有兩個(gè)思路:

1.通過(guò)相關(guān)配置,跳過(guò)SSL證書(shū)驗(yàn)證,完成請(qǐng)求。

2.下載證書(shū),將證書(shū)導(dǎo)入到JDK的證書(shū)管理里面。

第一種方法相當(dāng)于是取巧,逃避問(wèn)題,我們當(dāng)然不能那么做了,我們要迎接挑戰(zhàn),所以小編直接pass第一條,選擇第二條。

添加Https證書(shū)

下載證書(shū)

先通過(guò)瀏覽器將未簽名驗(yàn)證的證書(shū)保存到本地, 具體步驟:

點(diǎn)擊 不安全–> 證書(shū)–> 詳細(xì)信息 --> 復(fù)制到文件 然后默認(rèn)選擇 起一個(gè)文件名 , 保存即可。

(Mac下載:Mac找不到復(fù)制的按鈕。。。只能另辟蹊徑了)點(diǎn)地址欄上的小鎖,然后點(diǎn)證書(shū),然后將藍(lán)色的文件拖到要下載的文件夾即可。最好給它重命名方便使用。

導(dǎo)入證書(shū)

我們需要將證書(shū)導(dǎo)入到JDK的證書(shū)管理里面才能咋項(xiàng)目中使用我們剛剛下載的證書(shū)。導(dǎo)入命令如下:

keytool -import -noprompt -trustcacerts -alias  -keystore
 /Users/ZHONGHUI/develop/jdk-12.0.2.jdk/Contents/Home/lib/security/cacerts 
-storepass changeit -file eleme.cer

其中,因?yàn)槲覀冇玫氖荍DK12,跟常用的JDK8目錄是不一樣的,所以我的cacerts目錄是:/Users/ZHONGHUI/develop/jdk-12.0.2.jdk/Contents/Home/lib/security/cacerts,如果你用的是JDK1.8或者1.7的話,那么你的cacerts在jre下的 /lib/security/下。eleme是我們給復(fù)制過(guò)來(lái)的證書(shū)取得別名,eleme.cer就是我們下載改名后的證書(shū)。changeit 是密碼,如果changeit不行的話,就試試changeme,一般是changeit。

生成keystore文件

keytool -import -storepass changeit -file eleme.cer -keystore eleme.keystore

然后就會(huì)生成一個(gè)eleme.keystore文件,若權(quán)限不夠,加sudo即可。將它復(fù)制到項(xiàng)目的類路徑下。

項(xiàng)目中配置

將下面的RestTemplateConfig替換原來(lái)的:

package com..xxx.config; 
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
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.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.client.RestTemplate; 
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
 
@Configuration
public class RestTemplateConfig { 
    @Autowired
    private FastJsonHttpMessageConverter httpMessageConverter;
 
    @Bean
    RestTemplate restTemplate() throws Exception {
    	HttpComponentsClientHttpRequestFactory factory = new                                                    
    	        HttpComponentsClientHttpRequestFactory();
    	    factory.setConnectionRequestTimeout(5 * 60 * 1000);
    	    factory.setConnectTimeout(5 * 60 * 1000);
    	    factory.setReadTimeout(5 * 60 * 1000);
    	    // https
    	    SSLContextBuilder builder = new SSLContextBuilder();
    	    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    	    ClassPathResource resource = new ClassPathResource("nonghang.keystore");
    	    InputStream inputStream = resource.getInputStream();
    	    keyStore.load(inputStream, null);
    	    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
    	    Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
    	            .register("http", new PlainConnectionSocketFactory())
    	            .register("https", socketFactory).build();
    	    PoolingHttpClientConnectionManager phccm = new PoolingHttpClientConnectionManager(registry);
    	    phccm.setMaxTotal(200);
    	    CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).setConnectionManager(phccm).setConnectionManagerShared(true).build();
    	    factory.setHttpClient(httpClient);
    	    RestTemplate restTemplate = new RestTemplate(factory);
    	    List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
            ArrayList<HttpMessageConverter<?>> convertersValid = new ArrayList<>();
            for (HttpMessageConverter<?> converter : converters) {
                if (converter instanceof MappingJackson2HttpMessageConverter ||
                    converter instanceof MappingJackson2XmlHttpMessageConverter) {
                    continue;
                }
                convertersValid.add(converter);
            }
            convertersValid.add(httpMessageConverter);
            restTemplate.setMessageConverters(convertersValid);
    	    inputStream.close();
        return restTemplate;
    }
}
 

好啦,萬(wàn)事俱備只欠東風(fēng),自信滿滿的試了一下,發(fā)現(xiàn)還是行不通,深受打擊的我決定還是去看看導(dǎo)致這類報(bào)錯(cuò)的原因。

從根源出發(fā),https的socket工作原理是怎樣的?

https的socket工作原理流程圖如下:

那么,什么是SSL證書(shū)?

SSL 證書(shū)就是遵守 SSL協(xié)議,由受信任的數(shù)字證書(shū)頒發(fā)機(jī)構(gòu)CA,在驗(yàn)證服務(wù)器身份后頒發(fā),具有服務(wù)器身份驗(yàn)證和數(shù)據(jù)傳輸加密功能。

首先,要知道導(dǎo)致報(bào)這個(gè)異常的原因不僅僅是因?yàn)樽C書(shū)校驗(yàn)不通過(guò)。

1.在我們通過(guò)https鏈接服務(wù)器時(shí),服務(wù)器會(huì)給我們返回一個(gè)證書(shū),這個(gè)證書(shū)可能經(jīng)過(guò)CA認(rèn)證,也可能是未認(rèn)證的自制證書(shū),客戶端拿到這個(gè)證書(shū)后會(huì)對(duì)這個(gè)證書(shū)進(jìn)行驗(yàn)證,如果是經(jīng)過(guò)CA驗(yàn)證的證書(shū),自然證書(shū)校驗(yàn)就能通過(guò),自制證書(shū)自然就校驗(yàn)不同過(guò),從而導(dǎo)致上邊的異常。

2.證書(shū)校驗(yàn)通過(guò)后,還需要校驗(yàn)訪問(wèn)的域名是否和證書(shū)指定的域名是否匹配。未匹配也會(huì)導(dǎo)致如上異常。

3.上邊兩步都校驗(yàn)通過(guò)了才開(kāi)始進(jìn)行握手,但握手也有可能失敗,從而導(dǎo)致上邊的異常。

以上三個(gè)步驟中任何一個(gè)出了問(wèn)題,都會(huì)連接失敗。

首先,我們獲取的證書(shū)是經(jīng)過(guò)CA認(rèn)證的,理應(yīng)不會(huì)出現(xiàn)不通過(guò)的情況,第三方的域名也是沒(méi)有問(wèn)題的。那么到底是哪里出了問(wèn)題呢?

后來(lái)我們從網(wǎng)絡(luò)組那邊了解到,他們那邊對(duì)最近做了大的改動(dòng),之前的proxy都要重新加,加的時(shí)候把我們的給漏掉了。。。。辛苦大半天,被坑慘了啊。。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis-Plus主鍵生成策略的實(shí)現(xiàn)方法

    MyBatis-Plus主鍵生成策略的實(shí)現(xiàn)方法

    MyBatis-Plus提供了多種主鍵生成策略,包括自增、UUID、Redis和雪花算法,本文就來(lái)介紹一下,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • MyBatis數(shù)據(jù)脫敏的實(shí)現(xiàn)方案介紹

    MyBatis數(shù)據(jù)脫敏的實(shí)現(xiàn)方案介紹

    在我們數(shù)據(jù)庫(kù)中有些時(shí)候會(huì)保存一些用戶的敏感信息,比如:手機(jī)號(hào)、銀行卡等信息,如果這些信息以明文的方式保存,那么是不安全的
    2022-08-08
  • DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問(wèn)題

    DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問(wèn)題

    這篇文章主要介紹了DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例

    Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例

    這篇文章主要介紹了Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 用java實(shí)現(xiàn)斗地主發(fā)牌過(guò)程

    用java實(shí)現(xiàn)斗地主發(fā)牌過(guò)程

    這篇文章主要為大家詳細(xì)介紹了用java實(shí)現(xiàn)斗地主發(fā)牌過(guò)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • java分布式流式處理組件Producer分區(qū)理論

    java分布式流式處理組件Producer分區(qū)理論

    這篇文章主要為大家介紹了java分布式流式處理組件Producer分區(qū)理論詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java中IO流概述

    Java中IO流概述

    大家好,本篇文章主要講的是Java中IO流概述,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Kotlin Coroutines執(zhí)行異步加載示例詳解

    Kotlin Coroutines執(zhí)行異步加載示例詳解

    這篇文章主要給大家介紹了關(guān)于Kotlin Coroutines執(zhí)行異步加載的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • SpringBoot自動(dòng)初始化數(shù)據(jù)庫(kù)的方法分享

    SpringBoot自動(dòng)初始化數(shù)據(jù)庫(kù)的方法分享

    我們?cè)陧?xiàng)目中應(yīng)該經(jīng)常遇到過(guò)初始化數(shù)據(jù)的場(chǎng)景,特別是項(xiàng)目部署或者交付的時(shí)候,那么有什么方式可以在項(xiàng)目啟動(dòng)的時(shí)候自動(dòng)初始化數(shù)據(jù)庫(kù)呢,下面小編就來(lái)和大家分享幾個(gè)方法吧
    2023-08-08
  • MyBatis如何通過(guò)xml方式實(shí)現(xiàn)SaveOrUpdate

    MyBatis如何通過(guò)xml方式實(shí)現(xiàn)SaveOrUpdate

    這篇文章主要講如何通過(guò)xml方式實(shí)現(xiàn)SaveOrUpdate,但是仍然建議在Service中實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-06-06

最新評(píng)論

宜良县| 宣武区| 清徐县| 临高县| 九龙城区| 永兴县| 玛纳斯县| 九江县| 义马市| 沙坪坝区| 大悟县| 延长县| 会理县| 南川市| 连平县| 宜兰县| 金门县| 资源县| 乌海市| 美姑县| 华蓥市| 鄯善县| 沿河| 临朐县| 嘉鱼县| 曲沃县| 石门县| 镇原县| 宿州市| 肇源县| 东安县| 新野县| 巴彦县| 阿图什市| 鄂伦春自治旗| 龙里县| 革吉县| 阿克| 达孜县| 渭南市| 青岛市|