Okhttp連線https新增自產證書

2021-08-03 11:13:21 字數 2026 閱讀 9640

使用okhttp作為網路連線時,

okhttp現作為android網路連線框架已經很流行了,我也使用okhttp有三年了。以前https還是使用得少的,訪問別人的**,如果使用了https都是綠色的(在瀏覽器上看,某購火車票**的不是),在okhttp裡啥問題也沒有,最近的專案是公司自己的伺服器使用了https,但證書不是購買的,是自己產生的(使用jdk自產的),okhttp預設拒絕訪問這自產證書的https的連線。

怎麼辦?檢視okhttp說明,是可以向okhttp裡新增證書的。下面是向okhttp新增證書的內容了。證書可以瀏覽器上匯出,導時選擇x509,匯出結果的***.cer。

為了方便各模組新增自己的證書,各模組把需要用到的證書都放在assets裡和同一路徑的目錄下(我放置的目錄為assets/certs),android studio編譯時會把所以模組裡的assets/cert統一起來,到時遍歷這目錄就能讀取到所有證書了。

讀取證書檔案**如下:

// 新增https證書

try 

}} catch (ioexception ioe)

// 證書資料

private

static list certificates_data = new arraylist<>();

/*** 新增https證書

* @param

inputstream

*/public

synchronized

static

void

addcertificate

(inputstream inputstream)

byte buff = new

byte[len];

int dstpos = 0;

for (byte bytes:data) 

certificates_data.add(buff);

} catch (ioexception e) }}

/*** https證書

* @return

*/ public

static list getcertificatesdata()

那麼現在到將證書新增到okhttp裡去了:

* 新增證書**

@param

certificates

*/private

static

sslsocketfactory getsocketfactory

(list

certificates)

} catch (ioexception e)

sslcontext sslcontext = sslcontext.getinstance("tls");

trustmanage***ctory trustmanage***ctory =

trustmanage***ctory.getinstance(trustmanage***ctory.getdefaultalgorithm());

trustmanage***ctory.init(keystore);

sslcontext.init

(null,

trustmanage***ctory.gettrustmanagers(),

new securerandom()

);return sslcontext.getsocketfactory();

} catch (exception e)

return

null;

}ok,https就這樣了。

https建立連線

客戶端的瀏覽器向伺服器傳送客戶端 ssl 協議的版本號,加密演算法的種類,產生的隨機數,以及其他伺服器和客戶端之間通訊所需要的各種資訊。圖中1 伺服器向客戶端傳送 ssl 協議的版本號,加密演算法的種類,隨機數以及其他相關資訊,同時伺服器還將向客戶端傳送自己的證書。圖中2,3 客戶利用伺服器傳過來的...

okhttp使用心得 https驗證不通過 (一)

之前專案使用的是okhttp3.4版本的,tls協議支援1.0 1.2 等等 後來換成okhttp3.8.1,發現握手失敗 找了好多原因之後 發現吧tls加上1.0後,就可以握手成功了,但是tls1.0已經被認為是過時的和不安全的協議,應該是伺服器需要配置ssl協議版本之類的 後續跟蹤 並且okht...

nginx如何新增https

1 為什麼要啟用https 資料保密性。保證內容在傳輸過程中不會被第三方檢視到。就像快遞員傳遞包裹時都進行了封裝,別人無法知道裡面裝了什麼東西。資料完整性。及時發現被第三方篡改的傳輸內容。就像快遞員雖然不知道包裹裡裝了什麼東西,但他有可能中途掉包,資料完整性就是指如果被掉包,我們能輕鬆發現並拒收。身...