1 基本證書原理
常用的基本協(xié)議:
客戶端執(zhí)行https請(qǐng)求時(shí)勉痴,需要由TCP協(xié)議建立和釋放連接窘疮。這就涉及TCP協(xié)議的三次握手和四次揮手矫付。
TCP建立連接三次握手
- C-->S: 請(qǐng)求
- C<--S:ACK
- C-->S:確認(rèn)
TCP的四次揮手
- C-->S: 我的數(shù)據(jù)發(fā)送完成
- C<--S:確認(rèn)C 發(fā)送完成
- C<--S:確認(rèn)S數(shù)據(jù)也發(fā)送完成
- C-->S:確認(rèn)結(jié)束
http : 明文傳輸
https : 使用密鑰傳輸數(shù)據(jù)
對(duì)稱加密:使用同一key 加密解密揭斧, 因此key 傳輸是由風(fēng)險(xiǎn)的
非對(duì)稱加密: 使用公鑰舰始,私鑰崇棠,公鑰可以任意獲取,私鑰存在服務(wù)器
公鑰證書:含有公鑰丸卷,含有頒發(fā)組織易茬,申請(qǐng)者信息....
采用非對(duì)稱加密對(duì)https 缺點(diǎn)的改進(jìn),引入了CA及老, 進(jìn)行公開秘鑰
- 1-服務(wù)器的運(yùn)營(yíng)人員向數(shù)字證書認(rèn)證機(jī)構(gòu)(CA)提出公開密鑰的申請(qǐng);
- 2- CA通過線上抽莱、線下等多種手段驗(yàn)證申請(qǐng)者提供信息的真實(shí)性,如組織是否存在骄恶、企業(yè)是否合法食铐,是否擁有域名的所有權(quán)等;
- 3- 如果信息審核通過僧鲁,CA會(huì)對(duì)已申請(qǐng)的公開密鑰做數(shù)字簽名虐呻,然后分配這個(gè)已簽名的公開密鑰,并將該公開密鑰放入公鑰證書后綁定在一起寞秃。
證書包含以下信息:申請(qǐng)者公鑰斟叼、申請(qǐng)者的組織信息和個(gè)人信息、簽發(fā)機(jī)構(gòu)CA的信息春寿、有效時(shí)間朗涩、證書序列號(hào)等信息的明文,同時(shí)包含一個(gè)簽名绑改;
簽名的產(chǎn)生算法:首先谢床,使用散列函數(shù)計(jì)算公開的明文信息的信息摘要,然后厘线,采用CA的私鑰對(duì)信息摘要進(jìn)行加密识腿,密文即簽名; - 4- 客戶端在HTTPS握手階段向服務(wù)器發(fā)出請(qǐng)求造壮,要求服務(wù)器返回證書文件渡讼;
- 5- 客戶端讀取證書中的相關(guān)的明文信息,采用相同的散列函數(shù)計(jì)算得到信息摘要,然后成箫,利用對(duì)應(yīng)CA的公鑰解密簽名數(shù)據(jù)栖雾,對(duì)比證書的信息摘要,如果一致伟众,則可以確認(rèn)證書的合法性,即公鑰合法召廷;
- 6- 客戶端然后驗(yàn)證證書相關(guān)的域名信息凳厢、有效時(shí)間等信息;
- 7- 客戶端會(huì)內(nèi)置信任CA的證書信息(包含公鑰)竞慢,如果CA不被信任先紫,則找不到對(duì)應(yīng)CA的證書,證書也會(huì)被判定非法筹煮。
1.1 -HTTPS 單向傳輸
HTTPS遮精,它還要運(yùn)行SSL/TLS協(xié)議,SSL/TLS協(xié)議分兩層败潦,第一層是記錄協(xié)議本冲,主要用于傳輸數(shù)據(jù)的加密壓縮;第二層是握手協(xié)議劫扒,它建立在第一層協(xié)議之上檬洞,主要用于數(shù)據(jù)傳輸前的雙方身份認(rèn)證、協(xié)商加密算法沟饥、交換密鑰添怔。
SSL 握手協(xié)議的交換流程: (wireshark分析)
功能上分析:
對(duì)DH 算法說明,就是采用了隨機(jī)數(shù)+ 算法贤旷,使得C與S 可以共享密鑰广料, 在https 是最后C 傳給S 的pubkey 是通過公鑰證書加密了,因此服務(wù)獲取后幼驶,使用私鑰解密即可艾杏。在https 首先使用了非對(duì)稱加密,然后采用了對(duì)稱加密傳輸數(shù)據(jù)盅藻。
wireshark: 數(shù)據(jù)
4357:Client Hello信號(hào)糜颠,客戶端發(fā)送隨機(jī)數(shù)字+自己可以支持的加密方法。
4366:Server Hello信號(hào)萧求,服務(wù)器發(fā)送隨機(jī)數(shù)字+選擇雙方都支持的加密方式其兴,這里選擇的是TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,后面還將自己的證書發(fā)送了
4369:發(fā)送自己的公鑰和從CA申請(qǐng)的證書
4375:發(fā)送基于DH 的證書夸政,公鑰不被證書中包含元旬,需要單獨(dú)發(fā)送,DH 算法相關(guān)
4367:server 完成了發(fā)送DH, 選擇了加密方式,基本完成client 的握手
4386: client 在接受到4366 之后的消息后就可開始了執(zhí)行相應(yīng)的client 的邏輯。例如收到4375 發(fā)送的證書后匀归,驗(yàn)證證書的有效性【是否具有公鑰的第三方數(shù)字簽名坑资?保證安全盡量公鑰還是采用第三方數(shù)字簽名】,在此之后穆端,這個(gè)握手算是結(jié)束袱贮, client 與server 開始了采用使用對(duì)稱密鑰加解密數(shù)據(jù)傳輸。 認(rèn)為: 這里對(duì)稱密鑰沒有通過網(wǎng)絡(luò)傳遞体啰,DH 算法傳遞的只是一些公開的數(shù)據(jù)攒巍,因此保證了對(duì)稱密鑰的安全,不能被網(wǎng)絡(luò)竊取數(shù)據(jù)
4405~4407:主要考慮再次通信的方便性荒勇,new session ticket,這樣的操作是為了之后不用再進(jìn)行握手柒莉,節(jié)約服務(wù)器的資源
舉例再次通信:【沒有了發(fā)送證書的環(huán)節(jié)Certificate】
wireshark:分析的原始數(shù)據(jù):
鏈接:https://pan.baidu.com/s/1kdMaIs7tQ7epmUgWqPBgOQ
提取碼:2f03
1.2 -HTTPS 雙向傳輸
使用單向驗(yàn)證還是雙向驗(yàn)證,是服務(wù)器決定的沽翔。一般而言兢孝,我們的服務(wù)器都是對(duì)所有客戶端開放的,所以服務(wù)器默認(rèn)都是使用單向驗(yàn)證仅偎。如果你使用的是Tomcat服務(wù)器跨蟹,在配置文件server.xml中,配置Connector節(jié)點(diǎn)的clientAuth屬性即可橘沥。若為true喷市,則使用雙向驗(yàn)證,若為false威恼,則使用單向驗(yàn)證品姓。如果你的服務(wù),只允許特定的客戶端訪問箫措,那就需要使用雙向驗(yàn)證了腹备。
就是相當(dāng)于兩個(gè)C[s]<--->S[c], 客戶端與服務(wù)器端都有各自的公鑰與私鑰。
總結(jié):
單向驗(yàn)證中斤蔓,如果是你客戶端植酥,你需要拿到服務(wù)器的證書,并放到你的信任庫(kù)中弦牡;如果是服務(wù)端友驮,你要生成私鑰和證書,并將這兩個(gè)放到你的密鑰庫(kù)中驾锰,并且將證書發(fā)給所有客戶端卸留。
雙向驗(yàn)證中,如果你是客戶端椭豫,你要生成客戶端的私鑰和證書耻瑟,將它們放到密鑰庫(kù)中旨指,并將證書發(fā)給服務(wù)端,同時(shí)喳整,在信任庫(kù)中導(dǎo)入服務(wù)端的證書谆构。如果你是服務(wù)端,除了在密鑰庫(kù)中保存服務(wù)器的私鑰和證書框都,還要在信任庫(kù)中導(dǎo)入客戶端的證書搬素。
再次強(qiáng)調(diào),使用單向驗(yàn)證還是雙向驗(yàn)證魏保,是服務(wù)器決定的召锈。
2android 實(shí)現(xiàn)https 通信
2.1 ,根證書
從It 獲取公司的公鑰證書與根證書
根證書做成xxx.0 形式放置在
system/ca-certificates/files/
system/ca-certificates/google/files/
#openssl x509 -inform PEM -subject_hash_old -in xxx.pem | head -1
#9849bb9b
#touch 9849bb9b.0
#openssl x509 -inform PEM -subject_hash_old -in xxx.ai.pem -text > 9849bb9b.0
然后看9849bb9b.0仲器, 是否與其他xxx.0格式基本一致就可以了
如果公司的證書是續(xù)簽的缔恳,一般情況根證書是不會(huì)變的樊拓。
2.2,公鑰證書
這個(gè)要看code 寫法餐塘, 從哪里讀取公鑰證書
InputStream is = getApplicationContext().getAssets().open("srca.cer");
上面的就是公鑰srca.cer妥衣,如果從IT 哪里獲取的不是cer, 就需要抓換
openssl x509 -inform pem -in xxx.pem -outform der -out xxx.cer
查看生成文件的信息:
openssl x509 -inform der -in xxxx.cer -noout -text
其他方式轉(zhuǎn)換REF:
windows 方式轉(zhuǎn)換
2.3 ,服務(wù)器證書
服務(wù)放置對(duì)應(yīng)的公鑰證書與私鑰證書就可以了,這個(gè)放置的位置通常與開發(fā)服務(wù)器的code 有關(guān)系戒傻,有開發(fā)code 決定(ex:ota/conf /app.conf)
如何進(jìn)行調(diào)試:
1,服務(wù)器已經(jīng)搭建好税手,使用ubuntu 系統(tǒng),測(cè)試獲取證書需纳,check 是否與服務(wù)器公鑰一致
openssl s_client -showcerts -connect xxxx(服務(wù)器域名):443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem
openssl s_client -connect {HOSTNAME}:{PORT} -showcerts
2芦倒,通過網(wǎng)頁(yè)獲取查看, 查看證書不翩,如果服務(wù)有下載連接兵扬,可以通過瀏覽器查看是否可以下載。如果瀏覽器都是可以的口蝠,那就說明器钟,android 設(shè)備哪里設(shè)定有問題
瀏覽器查看證書:
其他指令:
openssl x509 -in xxx.crt -out mycert2391236.pem
REF:
Android的證書驗(yàn)證過程
https 基本原理及概念
證書制作
https://mp.weixin.qq.com/s/UiGEzXoCn3F66NRz_T9crA
https://blog.csdn.net/lee244868149/article/details/51790397/