一.Java調(diào)用HTTPS接口,繞過SSL認(rèn)證
1:說明
網(wǎng)絡(luò)編程中,HTTPS(Hypertext Transfer Protocol Secure)是一種通過加密的方式在計(jì)算機(jī)網(wǎng)絡(luò)上進(jìn)行安全通信的協(xié)議。網(wǎng)絡(luò)傳輸協(xié)議,跟http相比更安全,因?yàn)樗由狭薙SL/TLS協(xié)議來加密通信內(nèi)容。
Java調(diào)用HTTPS,需要與客戶端建立連接,但是建立連接的時(shí)候,需要進(jìn)行SSL認(rèn)證。有的時(shí)候?yàn)榱朔奖阏{(diào)用,我們會(huì)繞過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ù),存儲(chǔ)在表中,不需要跨環(huán)境,只在本地執(zhí)行,所以進(jìn)行SSL認(rèn)證稍有繁瑣,所以我決定繞過SSL認(rèn)證。
通過自定義SSL上下文的方式,繞過SSL認(rèn)證的方式。通過自定義信任管理器,你可以在繞過證書驗(yàn)證的同時(shí),實(shí)現(xiàn)自己的證書驗(yàn)證邏輯。這對(duì)于使用自簽名證書或特定信任機(jī)制的情況很有用。
最后返回一個(gè)繞過SSL認(rèn)證的?HttpClient對(duì)象。
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)建一個(gè)自定義的 SSL 上下文(SSLContext),用于繞過 SSL 證書驗(yàn)證。
- 在 SSL 上下文中加載信任材料(TrustMaterial),并使用自定義的?
TrustStrategy
?來信任所有證書。 - 創(chuàng)建一個(gè)主機(jī)名驗(yàn)證器(HostnameVerifier),用于繞過主機(jī)名驗(yàn)證。使用
NoopHostnameVerifier(主機(jī)名驗(yàn)證器)
意味著在SSL連接中不會(huì)對(duì)服務(wù)器的主機(jī)名進(jìn)行驗(yàn)證。主機(jī)名驗(yàn)證器用于驗(yàn)證SSL證書中的主機(jī)名與服務(wù)器實(shí)際的主機(jī)名是否匹配。NoopHostnameVerifier
是一個(gè)空實(shí)現(xiàn)的主機(jī)名驗(yàn)證器,它繞過了主機(jī)名驗(yàn)證,即使主機(jī)名不匹配,也會(huì)繼續(xù)進(jìn)行SSL連接。 - 創(chuàng)建一個(gè) 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)建一個(gè)自定義的?
CloseableHttpClient
?實(shí)例,使用上述的 SSL 連接套接字工廠。 - 如果在創(chuàng)建 SSL 上下文時(shí)發(fā)生異常,將打印異常堆棧跟蹤信息。
- 如果在創(chuàng)建 SSL 上下文時(shí)發(fā)生異常或拋出的異常類型無法識(shí)別,將返回默認(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請(qǐng)求
//創(chuàng)建HttpClient
HttpClient httpclient = Myutils.createSSLClientDefault();
//發(fā)送接口地址
HttpPost httppost = new HttpPost(SERVICE_URL);
//設(shè)置請(qǐng)求體格式Content-Type
httppost.setHeader("Content-Type", "application/json");
httppost.setHeader("Authorization", AUTHORIZATION_HEADER);
//定義String請(qǐng)求Json參數(shù)體
httppost.setEntity(new StringEntity(new String("{" +
"\"keyCode\": \"" + keycode + "\"," +
"\"algorithmParam\": \"SM4/ECB/PKCS7Padding\"," +
"\"data\": {" +
"\"SetlNewDTO\": \"" + this.convertDtoToBase64(accountPayDO) + "\"" +
"}" +
"}"), Charset.forName("UTF-8")));
//發(fā)送請(qǐng)求并接收response
HttpResponse httpresponse = httpclient.execute(httppost);
String result = EntityUtils.toString(httpresponse.getEntity(), "UTF-8");
ObjectMapper objectMapper = new ObjectMapper();
JsonNode responseJson = objectMapper.readTree(result);
// 從JSON對(duì)象中獲取鍵值對(duì),根據(jù)出參格式獲取出參數(shù)據(jù)
JsonNode jsonNode = responseJson.get("data");
JsonNode encData1 = jsonNode.get("encData");
String encDate2 = encData1.toString();
}
這段代碼是一個(gè)使用Apache HttpClient庫發(fā)送HTTP POST請(qǐng)求的示例。它發(fā)送一個(gè)帶有JSON參數(shù)的POST請(qǐng)求,并從響應(yīng)中提取特定的數(shù)據(jù)。
代碼中的execute
方法聲明了拋出Exception
異常,它接收一個(gè)String
類型的參數(shù)param
,但實(shí)際上沒有使用到該參數(shù)。
首先,代碼定義了服務(wù)的URL和授權(quán)頭信息。
然后,通過調(diào)用Myutils.createSSLClientDefault()
方法創(chuàng)建一個(gè)自定義的SSL HttpClient對(duì)象。就是上邊繞過SSL對(duì)應(yīng)的方法
接下來,創(chuàng)建一個(gè)HttpPost對(duì)象,并設(shè)置請(qǐng)求的URL和請(qǐng)求頭信息。
然后,構(gòu)造請(qǐng)求體的JSON參數(shù),并設(shè)置到HttpPost對(duì)象中。
構(gòu)造請(qǐng)求體的使用需要使用json格式參數(shù),也可以直接使用?GJson json = new GJson(jsonStr);將非JSON數(shù)據(jù)轉(zhuǎn)化為JSON格式,JSON格式的S他臉紅,需要給每個(gè)參數(shù)加上引號(hào),并且使用\轉(zhuǎn)譯。所以setEntity的時(shí)候需要帶有JSON格式的字符串。
String jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; GJson json = new GJson(jsonStr);
接著,通過調(diào)用HttpClient的execute
方法發(fā)送HttpPost請(qǐng)求,并接收HttpResponse響應(yīng)。
將響應(yīng)的實(shí)體內(nèi)容轉(zhuǎn)換為字符串,并存儲(chǔ)在result
變量中。
使用Jackson庫的ObjectMapper
類解析result
字符串為JsonNode對(duì)象。
從JsonNode對(duì)象中獲取特定的數(shù)據(jù),例如從"data"鍵中獲取"encData"鍵的值。
最后,將獲取到的"encData"值存儲(chǔ)在encDate2
變量中。
我的出參是這樣的,所以按照自己的格式替換數(shù)據(jù),便可以得到你想要的出參
{
"code": "0",
"message": "success",
"data": {
"encData": {
"date": "wxpOGSdQD68Jp7fC4KV"
}
}
}
需要注意的是,代碼中的URL、授權(quán)頭信息、JSON參數(shù)等是示例數(shù)據(jù),你需要根據(jù)實(shí)際情況進(jìn)行修改和替換。
此代碼片段只是一個(gè)簡(jiǎn)單的示例,實(shí)際使用時(shí)應(yīng)該考慮異常處理、資源釋放等更完善的邏輯。
?最高級(jí)的自律,從一點(diǎn)點(diǎn)到億點(diǎn)點(diǎn)。
二.?Java直接調(diào)用HTTP接口,并且獲取List出參,輸出數(shù)據(jù)List
1.代碼實(shí)現(xiàn)?
public WrapperResponse<List<WarningDTO>> queryBigWarning(WarnInfoBInfoQueryDTO warnInfoBInfoQueryDTO) throws Exception {
String SERVICE_URL = "http://127.0.0.1:8889/wakljfa";
//發(fā)送httpPost請(qǐng)求
//創(chuàng)建HttpClient
HttpClient httpclient = HttpClients.createDefault();
//發(fā)送接口地址
HttpPost httppost = new HttpPost(SERVICE_URL);
//定義String請(qǐng)求Json參數(shù)體
httppost.setEntity(new StringEntity(new String("{" +
"\"pageNum\": \"" + warnInfoBInfoQueryDTO.getPageNum() + "\"," +
"\"pageSize\": \"" + warnInfoBInfoQueryDTO.getPageSize() + "\"," +
"\"warnType\": \"" + warnInfoBInfoQueryDTO.getWarnType() + "\"" +
"}"), Charset.forName("UTF-8")));
httppost.setHeader("Content-Type", "application/json");
//發(fā)送請(qǐng)求并接收response
HttpResponse httpresponse = httpclient.execute(httppost);
String result = EntityUtils.toString(httpresponse.getEntity(), "UTF-8");
ObjectMapper objectMapper = new ObjectMapper();
JsonNode responseJson = objectMapper.readTree(result);
// 從JSON對(duì)象中獲取鍵值對(duì),根據(jù)出參格式獲取出參數(shù)據(jù)
JsonNode data = responseJson.get("data");
JsonNode listWarn = pageInfo.get("list");
Iterator<JsonNode> iterator = listWarn.iterator();
List<WarningDTO> warningDTOS = new ArrayList<>();
while (iterator.hasNext()) {
WarningDTO warningDTO = new WarningDTO();
JsonNode warningNode = iterator.next();
String warnOcurTime= warningNode.get("warnOcurTime").asText();
warningDTO.setWarnOcurTime(warnOcurTime);
String warnId= warningNode.get("warnId").asText();
warningDTO.setWarnId( warnId);
String id= warningNode.get("id").asText();
warningDTO.setId( Id);
warningDTOS.add(warningDTO);
}
return WrapperResponse.success(warningDTOS);
}
2.出參模式
"data": {
"list": [
{
"warnId": "000000000000000000000000000201",
"warnOcurTime": 1672502400000,
"id": "000000000000000000000000000201"
},
{
"warnId": "000000000000000000000000000301",
"warnOcurTime": 1672502400000,
"id": "000000000000000000000000000301"
}
]
}
(???? ) ?? ?看到這的朋友。如果可以的話。點(diǎn)點(diǎn)下邊的鏈接幫我投上兩票哦。????????????(???)
掘金2023年度人氣創(chuàng)作者打榜中,快來幫我打榜吧~ <https://activity.juejin.cn/rank/2023/writer/2606267657622381?utm_campaign=annual_2023&utm_medium=self_web_share&utm_source=Recently%E7%A5%9D%E7%A5%9D>文章來源:http://www.zghlxwxcb.cn/news/detail-738308.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-738308.html
到了這里,關(guān)于Java調(diào)用HTTPS接口,繞過SSL認(rèn)證的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!