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