Java如何使用SSLContext請(qǐng)求https鏈接
使用SSLContext請(qǐng)求https鏈接
先了解幾個(gè)關(guān)鍵類
SSLContext安全套接字協(xié)議的實(shí)現(xiàn)核心類SSLSocket擴(kuò)展自Socket用戶客戶端SSLSocketFactory工廠類SSLServerSocket擴(kuò)展自ServerSocket用于服務(wù)端SSLServerSocketFactorySSLServerSocket的工廠KeyStore密鑰證書KeyManager密鑰管理器TrustManager信任管理器X590TrustedManagerTrustManager的子接口,管理X509證書,驗(yàn)證遠(yuǎn)程鏈接
核心代碼
如下:
//首先自己實(shí)現(xiàn)信任管理器類,創(chuàng)建一個(gè)X509TrustManager對(duì)象
X509TrustManager x509m = new X509TrustManager() {
//返回受信任的X509證書數(shù)組
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
//檢查服務(wù)器的證書,若不信任該證書拋出異常,可以不檢查默認(rèn)都信任
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
//檢查客戶端證書,若不信任該證書拋出異常,咱們自己就是客戶端不用檢查
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
};
// 獲取一個(gè)SSLContext實(shí)例,核心對(duì)象
SSLContext s = SSLContext.getInstance("SSL");
// 初始化SSLContext.init(可以導(dǎo)入的證書,信任管理器,SecureRandom) 三個(gè)參數(shù)都可為null,沒有證書填寫null就行
s.init(null, new TrustManager[] { x509m }, new java.security.SecureRandom());
//獲取SSLSocket 用于通信
SSLSocketFactory factory = s.getSocketFactory();
SSLSocket s = (SSLSocket) factory.createSocket("localhost", port);
//獲取輸入輸出流
OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream();
//發(fā)送數(shù)據(jù)
DataOutputStream out = new DataOutputStream(output);
out.writeBytes("測(cè)試發(fā)送數(shù)據(jù)");
out.flush();
out.close();
//接收數(shù)據(jù)
Reader reader = new InputStreamReader(input, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(reader);
String str = null;
StringBuffer sb = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
reader.close();
System.out.println(sb.toString()); //打印返回的數(shù)據(jù)
這就是Java最原始的使用SSLContext創(chuàng)建SSLSocket發(fā)送https請(qǐng)求。
如果使用框架如okhttp httpclient 底層已經(jīng)實(shí)現(xiàn)https請(qǐng)求,CA機(jī)構(gòu)頒發(fā)的證書或者權(quán)威機(jī)構(gòu)頒發(fā)的證書都是直接信任的 直接使用即可不需要再重寫任何代碼,網(wǎng)上的好多文章說的都有點(diǎn)問題,我已經(jīng)親測(cè)可用,對(duì)于自己生成的證書的https服務(wù)才需要另外配置SSLContext這套代碼。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java Spring使用hutool的HttpRequest發(fā)送請(qǐng)求的幾種方式
- java中的常見幾種發(fā)送http請(qǐng)求實(shí)例
- java中調(diào)用https請(qǐng)求忽略ssl證書認(rèn)證代碼示例
- java?http請(qǐng)求獲取圖片并返回文件流給前端的方法步驟
- java實(shí)現(xiàn)調(diào)用http請(qǐng)求的五種常見方式
- Java中如何模擬HTTP請(qǐng)求并驗(yàn)證功能
- Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解
- Java實(shí)現(xiàn)HttpGet請(qǐng)求傳body參數(shù)
- java的http請(qǐng)求工具對(duì)比分析
相關(guān)文章
Springmvc 4.x利用@ResponseBody返回Json數(shù)據(jù)的方法
這篇文章主要介紹了Springmvc 4.x利用@ResponseBody返回Json數(shù)據(jù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
詳解MyBatis的動(dòng)態(tài)SQL實(shí)現(xiàn)原理
MyBatis提供了強(qiáng)大的動(dòng)態(tài)SQL語句生成功能,以應(yīng)對(duì)復(fù)雜的業(yè)務(wù)場(chǎng)景,本篇文章將結(jié)合MyBatis解析SQL語句的過程對(duì)MyBatis中對(duì)<if>,<where>,<foreach>等動(dòng)態(tài)SQL標(biāo)簽的支持進(jìn)行分析,需要的朋友可以參考下2023-07-07
JDK多版本共存并自由切換的操作指南(本文為JDK8和JDK17)
本文介紹了如何在Windows系統(tǒng)上配置多版本JDK(以JDK8和JDK17為例),并通過圖文結(jié)合的方式給大家講解了詳細(xì)步驟,具有一定的參考價(jià)值,需要的朋友可以參考下2025-03-03
關(guān)于@ResponseBody 默認(rèn)輸出的誤區(qū)的解答
這篇文章主要介紹了關(guān)于@ResponseBody 默認(rèn)輸出的誤區(qū)的解答,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
基于Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)易在線聊天功能(一)
這篇文章主要給大家介紹基于Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)易在線聊天功能(一),分為客戶端和服務(wù)端兩段代碼,非常具有參考價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
java之scan.next()與scan.nextline()函數(shù)的使用及區(qū)別
這篇文章主要介紹了java之scan.next()與scan.nextline()函數(shù)的使用及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

