欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot實現https雙向傳輸協(xié)議的示例代碼

 更新時間:2025年03月14日 09:41:24   作者:WellAdjested  
本文主要介紹了springboot實現https雙向傳輸協(xié)議的示例代碼,包含配置證書和私鑰路徑、調用請求方法等步驟,具有一定的參考價值,感興趣的可以了解一下

1.https 雙向傳輸協(xié)議概念

1.1. 單向認證

  • 我們在通常訪問一個網站,例如百度。這是一個單向的TLS認證。
  • 具體的過程為:
    • 服務器發(fā)送證書給客戶端。
    • 客戶端驗證證書有效之后,客戶端和服務器協(xié)商出一個對稱加密密鑰。
    • 由服務端的私鑰加密,并發(fā)送給客戶端。
    • 客戶端收到之后再用公鑰解密這個對稱密鑰。然后就開始用對稱密鑰加密傳輸的數據。
  • 特征:
    • 服務端并不校驗客戶端的合法性,來者不拒,絕大部分的網站都是這種類型。
    • 只有客戶端校驗服務器端的合法性。

1.2. 雙向認證

  • 有時候我們在一些安全性要求較高的場景下,服務器也需要來校驗客戶端的合法性。
  • 具體的過程為:
    • 在客戶端驗證了服務器證書的合法性之后,客戶端需要帶上自己的證書發(fā)送給服務器。
    • 服務器收到證書之后,比對服務器在信任鏈中是否信任了客戶端的證書。
    • 如果信任,則服務端校驗客戶端合法。
    • 如果證書不在服務端的受信列表上,則拒絕服務。
  • 這樣子其實就是建立了一條雙向認證的TLS傳輸通道。即互相校驗證書。

1.3. 非對稱加密交互流程

  • 如果用到的是非對稱加密,那么你和第三方之間就有兩對公私鑰,各自持有對方的公鑰和自己的私鑰。網絡通訊中我們一般用自己的私鑰將報文加簽,用第三方提供的公鑰將報文中涉及安全隱私的部分加密,然后第三方會用我們提供公鑰進行驗簽,驗簽通過后再用他們自己的私鑰將報文加密部分解密;

1.4. csr文件

  • CSR 即證書簽名申請(Certificate Signing Request),獲取 SSL 證書,需要先生成 CSR 文件并提交給證書頒發(fā)機構(CA)。CSR 包含了用于簽發(fā)證書的公鑰、用于辨識的名稱信息(Distinguished Name)(例如域名)、真實性和完整性保護(例如數字簽名),通常從 Web 服務器生成 CSR;
  • 證書申請者只要把CSR文件提交給證書頒發(fā)機構后,證書頒發(fā)機構使用其根證書私鑰簽名就生成了證書公鑰文件,也就是頒發(fā)給用戶的證書。

1.5. 生成證書相關流程

# 1. 生成客戶端csr和私鑰key 執(zhí)行這個指令后會生成csr文件和私鑰key
openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout privateKey.key -out request.csr

# 生成csr文件后,將csr文件發(fā)送給甲方,甲方簽發(fā)了ca.pem給我們

# 后續(xù)訪問甲方接口,就一直攜帶ca.pem和本地私鑰 用于傳輸過程中的文件和數據加密;

2. 使用springboot實現https雙向傳輸協(xié)議實例

2.1. 配置證書和私鑰路徑

  • 在配置文件中配置證書和私鑰路徑,使得項目能夠訪問到;
  • ca.pem,privateKey.key

2.2. 調用請求方法

 // 調用方法
    resp = apiService.request(true, POST, url, req);

2.3. ApiService層方法

  @Override
    public String request(Boolean ssl, HttpMethod method, String url, String reqBody) throws Exception {
        // 調用下方的request方法
        return request(ssl, method, url, null, reqBody);
    }

    //    雙向認證請求
    @Override
    public String request(Boolean ssl, HttpMethod method, String url, MultiValueMap<String, String> params,
            String reqBody)
            throws Exception {
        logger.info("request url to server =====> {}", url);
        logger.info("request body to server =====> {}", reqBody);
        // 根據實際需求添加請求頭
        HttpHeaders headers = new HttpHeaders();
        headers.set("token", "");

        ResponseEntity<String> resp = sslService.request(ssl, url, method, headers, params, reqBody);
        String respBody = resp.getBody();
        logger.info("resp body from server =====> {}", respBody);
        return respBody;
    }

2.4. sslService類中方法

        @Override
        public ResponseEntity<String> request(Boolean ssl, String url, HttpMethod method, HttpHeaders headers,
                        MultiValueMap<String, String> params, String reqBody) throws Exception {

                HttpsClient client = !ssl ? new HttpsClient(ssl)
                                : new HttpsClient(ssl, "證書路徑", "私鑰路徑");
                return RestClientUtil.request(client, url, method, headers, params, reqBody);

        }

2.5. HTTPS通信雙向認證工具類

        /**
         * @Description //HTTPS通信雙向認證工具類
         **/

        @Data
        public class HttpsClient {
        
            // true-啟用雙向認證,false-不啟用
            private boolean ssl;
            // 服務端公鑰
            private String serverPem;
            // 客戶端私鑰
            private String clientSK;

            public HttpsClient() {
            }

            public HttpsClient(Boolean ssl) {
                this.ssl = ssl;
            }

            public HttpsClient(Boolean ssl, String serverPem, String clientSK) {
                this.ssl = ssl;
                this.serverPem = serverPem;
                this.clientSK = clientSK;
            }

}

2.6. RestClientUtil類中方法

public static ResponseEntity<String> request(HttpsClient client, String url, HttpMethod method,
            HttpHeaders httpHeaders,
            MultiValueMap<String, String> params,
            String reqBody) throws Exception {
        httpHeaders.set("Content-Type", "application/json; charset=utf-8");
        HttpEntity<?> requestEntity = new HttpEntity<>(reqBody, httpHeaders);

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url).queryParams(params);
//        UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url).queryParams(params);
        RestTemplate rest = client.isSsl()
                ? new RestTemplate(HttpsClientUtil.rsaHttpComponentsClientHttpRequestFactory(client))
                : new RestTemplate(generateHttpRequestFactory());
        return rest.exchange(builder.toUriString(), method, requestEntity, String.class);
    }

  /**
     * 忽略SSL證書
     *
     * @return
     */
    private static HttpComponentsClientHttpRequestFactory generateHttpRequestFactory() {

        TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;

        SSLContext sslContext = null;

        try {

            sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (KeyManagementException e) {

            e.printStackTrace();

        } catch (KeyStoreException e) {

            e.printStackTrace();

        }

        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
                new NoopHostnameVerifier());

        HttpClientBuilder httpClientBuilder = HttpClients.custom();

        httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);

        CloseableHttpClient httpClient = httpClientBuilder.build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();

        factory.setHttpClient(httpClient);

        return factory;
    }

2.7. HttpsClientUtil類中方法

 public static HttpComponentsClientHttpRequestFactory rsaHttpComponentsClientHttpRequestFactory(HttpsClient client)
            throws Exception {
        // 獲取httpClient對象,防止重復創(chuàng)建--讀取證書信息,對象生成后不做其他操作所以未加鎖
        if (httpClient == null) {
            httpClient = createCloseableHttpClientByRsa(client);
        }
        HttpComponentsClientHttpRequestFactory httpsFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
//        httpsFactory.setReadTimeout(5000);
//        httpsFactory.setConnectTimeout(5000);
        httpsFactory.setReadTimeout(60 * 1000);
        httpsFactory.setConnectTimeout(60 * 1000);
        return httpsFactory;
    }

到此這篇關于springboot實現https雙向傳輸協(xié)議的示例代碼的文章就介紹到這了,更多相關springboot https雙向傳輸內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 客戶端設置超時時間真的很重要

    客戶端設置超時時間真的很重要

    今天小編就為大家分享一篇關于客戶端設置超時時間真的很重要,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中兩種拋出異常的方式示例詳解

    Java中兩種拋出異常的方式示例詳解

    在Java中有兩種拋出異常的方式,一種是throw,直接拋出異常,另一種是throws,間接拋出異常,本文給大家詳細說明java中兩種拋出異常的方式,感興趣的朋友一起看看吧
    2023-08-08
  • Java經典排序算法之歸并排序實現代碼

    Java經典排序算法之歸并排序實現代碼

    這篇文章主要介紹了Java經典排序算法之歸并排序實現代碼,歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個非常典型的應用,將已有序的子序列合并,得到完全有序的序列,需要的朋友可以參考下
    2023-10-10
  • Java中報錯org.springframework.jdbc.UncategorizedSQLException的多種解決方法

    Java中報錯org.springframework.jdbc.UncategorizedSQLException的多種

    本文主要介紹了Java中報錯org.springframework.jdbc.UncategorizedSQLException的多種解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • springboot使用IDEA遠程Debug

    springboot使用IDEA遠程Debug

    項目上線之后,如果日志打印的很模糊或者業(yè)務邏輯比較復雜,有時候無法定位具體的錯誤原因,因此可以通過IDEA遠程代理進行Debug,本文就來介紹一下如何使用
    2021-06-06
  • 關于@Scheduled參數及cron表達式解釋

    關于@Scheduled參數及cron表達式解釋

    這篇文章主要介紹了關于@Scheduled參數及cron表達式解釋,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 使用Java編寫控制JDBC連接、執(zhí)行及關閉的工具類

    使用Java編寫控制JDBC連接、執(zhí)行及關閉的工具類

    這篇文章主要介紹了如何使用Java來編寫控制JDBC連接、執(zhí)行及關閉的程序,包括一個針對各種數據庫通用的釋放資源的工具類的寫法,需要的朋友可以參考下
    2016-03-03
  • Java調用ChatGPT(基于SpringBoot和Vue)實現可連續(xù)對話和流式輸出的ChatGPT API

    Java調用ChatGPT(基于SpringBoot和Vue)實現可連續(xù)對話和流式輸出的ChatGPT API

    這篇文章主要介紹了Java調用ChatGPT(基于SpringBoot和Vue),實現可連續(xù)對話和流式輸出的ChatGPT API(可自定義實現AI助手),文中代碼示例介紹的非常詳細,感興趣的朋友可以參考下
    2023-04-04
  • Java Set接口及常用實現類總結

    Java Set接口及常用實現類總結

    Collection的另一個子接口就是Set,他并沒有我們List常用,并且自身也沒有一些額外的方法,全是繼承自Collection中的,因此我們還是簡單總結一下,包括他的常用實現類HashSet、LinkedHashSet、TreeSet的總結
    2023-01-01
  • Java編程實現NBA賽事接口調用實例代碼

    Java編程實現NBA賽事接口調用實例代碼

    這篇文章主要介紹了Java編程實現NBA賽事接口調用實例代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論