在客戶端程序中使用OpenSSL來實現HTTPS在證書認證上的一些分析

在客戶端程序中使用OpenSSL來實現HTTPS在證書認證上的一些分析

ssl握手一般流程:

通過wireshark抓包,可以確認一般情況下SSl握手的主要過程:
1.客戶端發送client hello,發送隨機數、算法集;
2.服務器端發送server hello,發送隨機數,協商的算法;
3.服務器端發送Certifacate,內含證書或者證書鏈;
4.服務器端發送Server Key Exchange,交換對稱密鑰;
5.客戶端發送Client Key Exchange,交換對稱密鑰;
6.開始用對稱密鑰加密數據並傳輸。

在第3、4步之間,客戶端需要驗證服務端的證書(可選),檢查抓包文件中服務器端發送過來的證書鏈,發現其證書鏈不包含根證書;
用openssl命令行驗證證書鏈:
[@he ~]$ openssl s_client -showcerts -connect xxx.com:443
會得到包含根證書的完整證書鏈。

注意:
一般服務器發回的證書鏈中都不會包含根證書,因爲要求根證書在瀏覽器或者系統中已經安裝,以保證最根本的安全性。

The server always sends a chain. As per the TLS standard, the chain may or may not include the root certificate itself; the client does not need that root since it already has it. And, indeed, if the client does not already have the root, then receiving it from the server would not help since a root can be trusted only by virtue of being already there.

綜上:
1.客戶端APP需要獲得一個根證書(系統、瀏覽器一般自帶一些根證書,也可以手動安裝,如果沒有,則手動拷貝一份),並調用SSL_CTX_load_verify_locations函數設置,使之成爲一個可信任的證書;
2.在服務器端的證書返回之後,OpenSSL會根據本地的受信證書驗證服務器端證書鏈;
3.通過調用SSL_set_verify設置驗證證書的回調,通過回調的參數可以獲取驗證的結果、錯誤碼、錯誤的證書深度等信息;
4.確保證書驗證通過的核心就是要保證從服務器端返回的證書能在本地的受信證書中追根溯源“找到根”,否則認證會失敗並會報告找不到發佈者錯誤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章