亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java調(diào)用HTTPS接口實(shí)現(xiàn)繞過SSL認(rèn)證

 更新時間:2023年11月01日 14:11:02   作者:Recently 祝祝  
SSL認(rèn)證是確保通信安全的重要手段,有的時候?yàn)榱朔奖阏{(diào)用,我們會繞過SSL認(rèn)證,這篇文章主要介紹了Java如何調(diào)用HTTPS接口實(shí)現(xiàn)繞過SSL認(rèn)證,需要的可以參考下

1.說明

網(wǎng)絡(luò)編程中,HTTPS(Hypertext Transfer Protocol Secure)是一種通過加密的方式在計算機(jī)網(wǎng)絡(luò)上進(jìn)行安全通信的協(xié)議。網(wǎng)絡(luò)傳輸協(xié)議,跟http相比更安全,因?yàn)樗由狭薙SL/TLS協(xié)議來加密通信內(nèi)容。

Java調(diào)用HTTPS,需要與客戶端建立連接,但是建立連接的時候,需要進(jìn)行SSL認(rèn)證。有的時候?yàn)榱朔奖阏{(diào)用,我們會繞過SSL認(rèn)證。但是在特定環(huán)境中,繞過SSL認(rèn)證是十分不安全的,不推薦這么做。SSL認(rèn)證是確保通信安全的重要手段,繞過認(rèn)證的話可能帶來一系列的安全問題。

所以一般繞過SSL認(rèn)證不在生產(chǎn)環(huán)境中使用。

2.繞過SSL認(rèn)證

因?yàn)槲冶敬握{(diào)用HTTPS接口的目的是調(diào)用數(shù)據(jù),存儲在表中,不需要跨環(huán)境,只在本地執(zhí)行,所以進(jìn)行SSL認(rèn)證稍有繁瑣,所以我決定繞過SSL認(rèn)證。

通過自定義SSL上下文的方式,繞過SSL認(rèn)證的方式。通過自定義信任管理器,你可以在繞過證書驗(yàn)證的同時,實(shí)現(xiàn)自己的證書驗(yàn)證邏輯。這對于使用自簽名證書或特定信任機(jī)制的情況很有用。

最后返回一個繞過SSL認(rèn)證的 HttpClient對象。

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
 
 
// 創(chuàng)建自定義的 SSL 上下文,用于繞過證書驗(yàn)證
	public static CloseableHttpClient createSSLClientDefault() {
		try {
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				// 信任所有證書
				public boolean isTrusted(X509Certificate[] arg0, String arg1)
						throws CertificateException {
					return true;
				}
			}).build();
			// 創(chuàng)建主機(jī)名驗(yàn)證器,用于繞過主機(jī)名驗(yàn)證
			HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
			// 創(chuàng)建 SSL 連接套接字工廠,將自定義的 SSL 上下文和主機(jī)名驗(yàn)證器應(yīng)用于 HTTPS 連接
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
			// 創(chuàng)建自定義的 CloseableHttpClient 實(shí)例,將 SSL 連接套接字工廠應(yīng)用于 HTTP 客戶端
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		}
		return HttpClients.createDefault();
	}

該方法的實(shí)現(xiàn)邏輯如下:

  • 創(chuàng)建一個自定義的 SSL 上下文(SSLContext),用于繞過 SSL 證書驗(yàn)證。
  • 在 SSL 上下文中加載信任材料(TrustMaterial),并使用自定義的 TrustStrategy 來信任所有證書。
  • 創(chuàng)建一個主機(jī)名驗(yàn)證器(HostnameVerifier),用于繞過主機(jī)名驗(yàn)證。使用NoopHostnameVerifier(主機(jī)名驗(yàn)證器)意味著在SSL連接中不會對服務(wù)器的主機(jī)名進(jìn)行驗(yàn)證。主機(jī)名驗(yàn)證器用于驗(yàn)證SSL證書中的主機(jī)名與服務(wù)器實(shí)際的主機(jī)名是否匹配。NoopHostnameVerifier是一個空實(shí)現(xiàn)的主機(jī)名驗(yàn)證器,它繞過了主機(jī)名驗(yàn)證,即使主機(jī)名不匹配,也會繼續(xù)進(jìn)行SSL連接。
  • 創(chuàng)建一個 SSL 連接套接字工廠(SSLConnectionSocketFactory),將自定義的 SSL 上下文和主機(jī)名驗(yàn)證器應(yīng)用于 HTTPS 連接。創(chuàng)建自定義的SSL連接。有四種實(shí)現(xiàn)方式(指定SSL/TLS協(xié)議版本、指定加密算法和密碼套件、自定義信任管理器、自定義主機(jī)名驗(yàn)證器),其中通過SSLConnectionSocketFactory指定自定義的主機(jī)名驗(yàn)證器(HostnameVerifier),以控制主機(jī)名驗(yàn)證的行為。
  • 創(chuàng)建一個自定義的 CloseableHttpClient 實(shí)例,使用上述的 SSL 連接套接字工廠。
  • 如果在創(chuàng)建 SSL 上下文時發(fā)生異常,將打印異常堆棧跟蹤信息。
  • 如果在創(chuàng)建 SSL 上下文時發(fā)生異?;驋伋龅漠惓n愋蜔o法識別,將返回默認(rèn)的 CloseableHttpClient 實(shí)例。

3.調(diào)用HTTPS接口

private static final String SERVICE_URL = "https://ip:port/api/v1/cipher/json/create";
    private static final String AUTHORIZATION_HEADER = "savhsdkfas==";
 
    public ReturnT<String> execute(String param) throws Exception {
 
        //發(fā)送httpPost請求
        //創(chuàng)建HttpClient
        HttpClient httpclient = Myutils.createSSLClientDefault();
        //發(fā)送接口地址
        HttpPost httppost = new HttpPost(SERVICE_URL);
        //設(shè)置請求體格式Content-Type
        httppost.setHeader("Content-Type", "application/json");
        httppost.setHeader("Authorization", AUTHORIZATION_HEADER);
 
        //定義String請求Json參數(shù)體
        httppost.setEntity(new StringEntity(new String("{" +
                "\"keyCode\": \"" + keycode + "\"," +
                "\"algorithmParam\": \"SM4/ECB/PKCS7Padding\"," +
                "\"data\": {" +
                "\"SetlNewDTO\": \"" + this.convertDtoToBase64(accountPayDO) + "\"" +
                "}" +
                "}"), Charset.forName("UTF-8")));
        //發(fā)送請求并接收response
        HttpResponse httpresponse = httpclient.execute(httppost);
        String result = EntityUtils.toString(httpresponse.getEntity(), "UTF-8");
 
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode responseJson = objectMapper.readTree(result);
        // 從JSON對象中獲取鍵值對,根據(jù)出參格式獲取出參數(shù)據(jù)
        JsonNode jsonNode = responseJson.get("data");
        JsonNode encData1 = jsonNode.get("encData");
        String encDate2 = encData1.toString();
 
    }

這段代碼是一個使用Apache HttpClient庫發(fā)送HTTP POST請求的示例。它發(fā)送一個帶有JSON參數(shù)的POST請求,并從響應(yīng)中提取特定的數(shù)據(jù)。

代碼中的execute方法聲明了拋出Exception異常,它接收一個String類型的參數(shù)param,但實(shí)際上沒有使用到該參數(shù)。

首先,代碼定義了服務(wù)的URL和授權(quán)頭信息。

然后,通過調(diào)用Myutils.createSSLClientDefault()方法創(chuàng)建一個自定義的SSL HttpClient對象。就是上邊繞過SSL對應(yīng)的方法

接下來,創(chuàng)建一個HttpPost對象,并設(shè)置請求的URL和請求頭信息。

然后,構(gòu)造請求體的JSON參數(shù),并設(shè)置到HttpPost對象中。

構(gòu)造請求體的使用需要使用json格式參數(shù),也可以直接使用 GJson json = new GJson(jsonStr);將非JSON數(shù)據(jù)轉(zhuǎn)化為JSON格式,JSON格式的S他臉紅,需要給每個參數(shù)加上引號,并且使用\轉(zhuǎn)譯。所以setEntity的時候需要帶有JSON格式的字符串。

String jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
 
GJson json = new GJson(jsonStr);

接著,通過調(diào)用HttpClient的execute方法發(fā)送HttpPost請求,并接收HttpResponse響應(yīng)。

將響應(yīng)的實(shí)體內(nèi)容轉(zhuǎn)換為字符串,并存儲在result變量中。

使用Jackson庫的ObjectMapper類解析result字符串為JsonNode對象。

從JsonNode對象中獲取特定的數(shù)據(jù),例如從"data"鍵中獲取"encData"鍵的值。

最后,將獲取到的"encData"值存儲在encDate2變量中。

我的出參是這樣的,所以按照自己的格式替換數(shù)據(jù),便可以得到你想要的出參

{
    "code": "0",
    "message": "success",
    "data": {
        "encData": {
            "date": "wxpOGSdQD68Jp7fC4KV"
        }
    }
}

需要注意的是,代碼中的URL、授權(quán)頭信息、JSON參數(shù)等是示例數(shù)據(jù),你需要根據(jù)實(shí)際情況進(jìn)行修改和替換。

此代碼片段只是一個簡單的示例,實(shí)際使用時應(yīng)該考慮異常處理、資源釋放等更完善的邏輯。

以上就是Java調(diào)用HTTPS接口實(shí)現(xiàn)繞過SSL認(rèn)證的詳細(xì)內(nèi)容,更多關(guān)于Java HTTPS接口的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JAVA開發(fā)常用類庫UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解

    JAVA開發(fā)常用類庫UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳

    這篇文章主要介紹了JAVA開發(fā)常用類庫UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解,需要的朋友可以參考下
    2020-02-02
  • mybatis之增刪改查

    mybatis之增刪改查

    本篇文章主要介紹了Mybatis實(shí)現(xiàn)數(shù)據(jù)的增刪改查實(shí)例(CRUD),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • 2020版IDEA整合GitHub的方法詳解

    2020版IDEA整合GitHub的方法詳解

    這篇文章主要介紹了2020版IDEA整合GitHub的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java?NIO實(shí)戰(zhàn)之多人聊天室

    Java?NIO實(shí)戰(zhàn)之多人聊天室

    這篇文章主要為大家詳細(xì)介紹了Java?NIO實(shí)戰(zhàn)之多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • springboot整合apache ftpserver詳細(xì)教程(推薦)

    springboot整合apache ftpserver詳細(xì)教程(推薦)

    這篇文章主要介紹了springboot整合apache ftpserver詳細(xì)教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Java反射機(jī)制詳解

    Java反射機(jī)制詳解

    Java的反射機(jī)制是在運(yùn)行狀態(tài)中,對于任何一個類,都可以知道這個類的所有屬性和方法,對于任何一個對象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息,這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為Java的反射機(jī)制
    2022-09-09
  • 詳解Java中static關(guān)鍵字和內(nèi)部類的使用

    詳解Java中static關(guān)鍵字和內(nèi)部類的使用

    這篇文章主要為大家詳細(xì)介紹了Java中static關(guān)鍵字和內(nèi)部類的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • Java基礎(chǔ)之位運(yùn)算知識總結(jié)

    Java基礎(chǔ)之位運(yùn)算知識總結(jié)

    最近接觸到了java位運(yùn)算,之前對位運(yùn)算的了解僅僅停留在表現(xiàn)結(jié)果上,乘2除以2,對背后的原理并不了解,現(xiàn)在學(xué)習(xí)記錄一下,需要的朋友可以參考下
    2021-05-05
  • SpringBoot使用Caffeine實(shí)現(xiàn)緩存的示例代碼

    SpringBoot使用Caffeine實(shí)現(xiàn)緩存的示例代碼

    本文主要介紹了SpringBoot使用Caffeine實(shí)現(xiàn)緩存的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 一種新的日期處理方式之JavaScript Temporal API

    一種新的日期處理方式之JavaScript Temporal API

    JavaScript Temporal API是一種為Web開發(fā)人員提供了一種新的處理日期和時間數(shù)據(jù)類型的方式。它的目的是使操作日期和時間更加簡單和可靠,而且不用擔(dān)心歷史時區(qū)問題或全球化協(xié)調(diào)時間(UTC)之類的問題,感興趣的同學(xué)可以參考閱讀
    2023-05-05

最新評論