JDK SSL連線建立的一些細節及解釋

2021-08-27 13:18:36 字數 1351 閱讀 2544

ssl通道能解決使用者驗證,指紋防篡改,資料加密。 使用者驗證通過雙方的證書鏈來進行, 防篡改有證書的數字簽名,資料加密則由ssl握手協商後的對稱密碼來對socket包進行加密。

ssl雙向驗證中,1)客戶端需要提供自己的證書供伺服器端進行驗證。2)伺服器端用客戶端的證書中的公鑰對握手資料加密,客戶端需要用自己的金鑰來解密握手資料。3)握手中需要產生隨機數。 所以jdk中的sslcontext中的初始化方法init中需要這三個引數,其宣告方法為

init(keymanager km, trustmanager tm, securerandom random) ,

以下為樣例,我們這裡不打算從jdk的keytool建立的庫中取證書,只是直接從乙個已知的字串中拿證書,所以直接實現乙個簡單的trustmanager和keymanager:

sslcontext = sslcontext.getinstance("ssl");

sslcontext.init(new keymanager

,new trustmanager

,new securerandom ());

******keymanager實現了x509keymanager介面,儲存自己的證書內容和私鑰。

******trustmanager實現了trustmanager介面,儲存了客戶端信任的證書。

init後sslcontext初始化完成,此時可以呼叫sslcontext.getsocketfactory()取得sslsocketfactory例項。然後用取到的factory來建立sslsocket連線,當然,還需要提供socket物件,host位址,host埠:

(sslsocket) sslssfactory.createsocket(socket s, string host, int port, boolean autoclose);
得到了sslsocket之後的操作就跟普通socket一樣了,socket.getoutputstream()

sslsocket有幾個選項設定ssl連線建立時的設定,如配置伺服器模式或客戶端模式,以下是較有用的幾個:

sslsocket.setenabledciphersuites( new string);

sslsocket支援的密碼套件。

sslsocket.setenablesessioncreation( true );

新的ssl可以此socket建立。

sslsocket.setneedclientauth( true );

是否要求客戶端身份驗證,既校驗證書。

sslsocket.setuseclientmode( false );

握手時使用什麼模式(客戶端/伺服器)。

C 的一些細節

1.c 中,將負數賦值給unsigned是完全合法的。例如,將 1賦值給unsigned char,那麼結果是255.2.c 中,double的精度和計算速度都要超過float,long double則需要承擔額外的執行代價。3.std ou t hi d endl 等價於std out hi 4....

迴圈的一些細節

1 迴圈執行次數相同,大迴圈放在外面還是小迴圈放在外層效率高呢?int end1 10 int end2 100 int end3 1000000 long starttime system.nanotime 開始時間 for int i 1 i end3 i long endtime system...

SDWebImage的一些細節

清空快取 cleandisk 清除過期快取,計算當前快取的大小,和設定的最大快取數量比較,如果超出那麼會繼續刪除 按照檔案穿件的先後順序 cleardisk 直接刪除重新建立 7天 sdwebimagemanager sharedmanager imagecache cleandisk 取消當前所有...