1. 程式人生 > 實用技巧 >HTTPS(二)證書合法性校驗

HTTPS(二)證書合法性校驗

在客戶端與服務端的連線過程中,服務端會把證書發給客戶端,客戶端需要基於CA認證體系對證書的合法性進行驗證
一、 權威認證機構
1、在CA認證體系中,所有的證書都是由權威機構來頒發
2、CA根證書的來源有兩種,一種是作業系統中內建的的,另外一種就是瀏覽器自帶的
windows在可以在執行->certmgr.msc

二、 證書驗證過程
1、服務方向第三方機構CA提交公鑰、組織資訊、個人資訊(域名)等資訊並申請認證;
2、CA通過線上、線下等多種手段驗證申請者提供資訊的真實性,如組織是否存在、企業是否合法,是否擁有域名的所有權等;
3、如資訊稽核通過,CA會向申請者簽發認證檔案-證書。
1)證書包含以下資訊:申請者公鑰、申請者的組織資訊和個人資訊、簽發機構CA的資訊、有效時間、證書序列號等資訊的明文,同時包含一個簽名;
2)簽名的產生演算法:
首先,使用雜湊函式計算公開的明文資訊的資訊摘要,然後,採用CA的私鑰對資訊摘要進行加密,密文即簽名;
4、客戶端向服務端發出請求時,服務端返回證書檔案;
5、客戶端讀取證書中的相關的明文資訊,採用相同的雜湊函式計算得到資訊摘要,然後,利用對應CA的公鑰解密簽名資料,對比證書的資訊摘要,如果一致,則可以確認證書的合法性,即公鑰合法;
6、客戶端驗證證書相關的域名資訊、有效時間等資訊;
7、客戶端會內建信任CA的證書資訊(包含公鑰),如果CA不被信任,則找不到對應 CA的證書,證書也會被判定非法。

在這個過程注意幾點:
1、申請證書不需要提供私鑰,確保私鑰永遠只能伺服器掌握;
2、證書的合法性仍然依賴於非對稱加密演算法,證書主要是增加了伺服器資訊以及簽名;
3、內建CA對應的證書稱為根證書
4、證書=公鑰(服務方生成密碼對中的公鑰)+申請者與頒發者資訊+簽名(用CA機構生成的密碼對的私鑰進行簽名);

三、中間證書
如果服務方的證書不是直接向根證書頒發機構申請的,而是向根證書頒發機構的授權機構申請的,此時的證書驗證,就是由下往上逐級進行驗證。
如下是baidu伺服器返回的證書,可以看到www.baidu.com的證書是由GlobalSign G2簽發的,而GlobalSign G2是由GlobalSign Root(根證書)簽發的。
即baidu的證書合法性由GlobalSign G2保證,而GlobalSign G2由GlobalSign Root保證其合法性,如果GlobalSign G2是合法的,那麼baidu的證書就是合法的。

抓包分析,在Cerfiticate階段,傳送了兩個證書,一個baidu.com的證書,一個GlobalSign G2的證書

一個證書包括待簽名證書內容,簽名演算法,證書籤名

客戶端讀取證書中的相關的明文資訊,採用相同的雜湊函式計算得到資訊摘要,然後,利用對應CA的公鑰解密簽名資料,對比證書的資訊摘要,如果一致,則可以確認證書的合法性,即公鑰合法;

證書GlobalSign G2的簽發CA是根CA,使用系統內建的根證書進行認證。

四、 證書鏈的缺失
有些情況下,我們使用不同的瀏覽器去訪問相同的域名,可能會出現某些瀏覽器顯示該域名可信,某些瀏覽器顯示不可信,那有可能就是證書鏈不完整導致的,也就是中間證書缺失。
現代的瀏覽器都有證書自動下載的功能,但很多瀏覽器在安裝後是使用系統內建的證書庫,如果你缺失的那張CA證書,在系統的內建證書庫中不存在的話,即使你的證書確實是可信的,但依舊會顯示成不可信,只有等到瀏覽器自動把缺失的那張CA證書從網上下載下來之後,訪問該網站才會顯示成可信狀態。
有一些版本安卓裝置的應用不會自動下載補全正式,導致顯示不可信,那麼我們可以手動將證書鏈補全,然後更新服務端的證書,這樣裝置下載證書的時候,就是完整的證書鏈,就不會出現不可信的狀態。
https://myssl.com/chain_download.html 此網站提供證書鏈補全的功能

五、 申請免費的證書
Let's Encrypt 可以提供免費的證書申請,但是需要每三個月進行一次續簽
1、安裝acme

git clone https://github.com/Neilpang/acme.sh.git 
cd acme.sh/ 
./acme.sh --install 
安裝後自動設定定時任務 定時任務會在每天0點47分呼叫acme.sh程式,以檢查證實是否過期,是否需要續簽等
 # crontab -l 47 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

2、設定阿里DNS子賬號
由於需要使用阿里dns進行驗證,所以可以設定子賬號
建立阿里雲dns子賬戶,獲取子賬號的key和secret

export Ali_Key="xxxxxxxxxxxx"
export Ali_Secret="xxxxxxxxxxx"
/root/.acme.sh/acme.sh --issue -d tenserpay.xyz -d *.tenserpay.xyz --dns dns_ali --keylength ec-256 --ecc --log --force
執行後,這些資訊會記錄在相關目錄中,後續的執行將自動執行
引數:
–issue:簽發,
--dns dns_ali:指明使用“dns_ali”作為驗證方式
-d:指定證書中的域名

# ll /root/.acme.sh/tenserpay.xyz_ecc/
total 28
-rw-r--r-- 1 root root 1648 Oct 14 09:33 ca.cer   # Let’s Encrypt的中級證書
-rw-r--r-- 1 root root 3303 Oct 14 09:33 fullchain.cer # 包含中級證書的域名證書
-rw-r--r-- 1 root root 1655 Oct 14 09:33 tenserpay.xyz.cer # 無中級證書的域名證書
-rw-r--r-- 1 root root  630 Oct 14 09:33 tenserpay.xyz.conf # 該域名的配置檔案
-rw-r--r-- 1 root root  460 Oct 14 09:32 tenserpay.xyz.csr # 該域名的CSR證書請求檔案
-rw-r--r-- 1 root root  228 Oct 14 09:32 tenserpay.xyz.csr.conf # 該域名的CSR請求檔案的配置檔案
-rw-r--r-- 1 root root  302 Oct 14 09:32 tenserpay.xyz.key # 該域名證書的私鑰