HTTPS認證

目錄:
1、https認證原理簡介
2、單向認證、雙向認證

1、https認證原理簡介

(轉自lanp74的博客)

HTTPS的使用保證了用戶數據是加密傳輸的,無法被其他人竊取;服務器認證保證了客戶端的數據只能發送倒被信任的服務器,避免了中間人攻擊;客戶端認證則確保只用合法的客戶端才可以發送數據到我們的服務器。

PKI(公鑰基礎設施)技術是HTTPS的基礎,PKI與非對稱密鑰加密技術密切相關,包括消息摘要、數字簽名和加密服務,而數字證書以及證書機構(CA – Certificate Authority)是PKI中的重要概念。

數字證書是一個計算機文件,一般由可信的證書機構頒發,它包含了證書所有者的一般信息和公開密鑰(公鑰),并且能夠證明這個公鑰確實是證書所有者所合法擁有的- 這一點是由CA對數字證書的簽名來保證的(簽名用到了信息摘要以及非對稱加密算法,使用CA的私鑰加密)- 在這里我們需要使用CA的數字證書(包含CA的公鑰)來驗證簽名的合法性。那么我們如何驗證CA數字證書的合法性呢?CA的信任鏈可以解決這個問題:證書機構是具有層級關系的,一個CA的證書是由上一級CA簽發的,因此它的合法性由它的上一級CA來驗證,其中最頂層的證書機構被稱為根CA,它的證書被稱為根證書,如果一個鏈條的根證書是合法可信的,那么我們就認為在這個鏈條上的所有CA以及它們所簽發的證書都是合法可信的。于是,最終的問題就是如何保證根證書的合法性呢?原來,我們所使用的基本計算機軟件,比如瀏覽器和服務器軟件,都會內置根CA的自簽名證書,只要我們使用的基本軟件可信,那么就能保證根CA證書的合法有效。

HTTPS是工作于SSL層之上的HTTP協議,SSL(安全套接層)工作于TCP層之上,向應用層提供了兩個基本安全服務:認證和保密。SSL有三個子協議:握手協議,記錄協議和警報協議。其中握手協議實現服務器與客戶端的認證與密鑰交換,記錄協議進行數據加密并保證數據的完整性,警報協議則規定了錯誤類型和處理機制。

SSL握手協議包含4個階段,下面簡單介紹每個階段。

第一階段:建立安全能力

由客戶端發起,向服務器發送Client Hello消息,其中包含SSL版本,客戶端隨機數(用于生成密鑰),會話號,加密算法清單,壓縮算法清單。
服務器返回Server Hello消息,其中包含SSL版本,服務器隨機數(用于生成密鑰),會話號,選擇的加密算法,選擇的壓縮算法。
第二階段:服務器認證與密鑰交換

服務器是本階段所有信息的發送方,共分三步。
第一步,證書,服務器將服務器數字證書以及整個CA證書鏈發給客戶端,客戶端由此獲得服務器公鑰;客戶端還可以在這一步驗證服務器是否可信,如果不可信則客戶端可以停止連接,并提醒用戶注意。
第二步,證書請求,服務器請求客戶端的數字證書,客戶端認證在SSL中是可選的,因此這一步也是可選的。
第三步,服務器握手完成,發送這個消息后,服務器等待客戶端響應。
第三階段:客戶端認證與密鑰交換

客戶端是本階段所有信息的發送方,共分三步。
第一步,證書,客戶端將客戶端數字證書發送給服務器,里面包含了客戶端的公鑰。通常來說這個證書應該是由服務提供者分發給客戶端,由指定的CA簽發的,因此服務器可以驗證客戶端證書的合法性,并決定是否繼續。
第二步,密鑰交換,客戶端生成48字節的預備秘密,用服務器的公鑰加密,然后發送給服務器。這個預備秘密只有客戶端和服務器才能知道,與雙方在之后會話中使用的對稱密鑰相關。在這一步也間接驗證了服務器,服務器必須擁有與證書對應的私鑰才能解密預備秘密。
第三步,證書驗證,客戶端還需要向服務器驗證自己是真正的客戶端(數字證書只是證明客戶端擁有合法的公鑰,但無法證明它就是客戶端,擁有與公鑰對應的私鑰才是關鍵),為此客戶端把預備秘密、客戶端隨機數和服務器隨機數組合起來,用私鑰對結果簽名,發送給服務器。服務器利用客戶端公鑰就可以得到原始數據,用以驗證客戶端的真實性。
第四階段:完成

在這個階段,客戶端和服務器各自獨立的生成相同的主秘密和對稱密鑰,主秘密和對稱密鑰只有它們自己知道。主秘密和對稱密鑰由預備秘密、客戶端隨機數和服務器隨機數組合后,經過消息摘要算法生成。

SSL握手之后就進入會話階段,客戶端和服務器使用握手協議中生成的對稱密鑰進行加密和解密以保證通信的安全。

綜上所述,如果要完成HTTPS的雙向認證需要以下密鑰和證書:

服務器端 - 1.服務器私鑰 2.由CA簽發的含有服務器公鑰的數字證書 3.CA的數字證書。在雙向認證的實踐中,通常服務器可以自己作為證書機構,并且由服務器CA簽發服務器證書和客戶端證書。

客戶端 - 1.客戶端私鑰 2. 由CA簽發的含有客戶端公鑰的數字證書。為了避免中間人攻擊,客戶端還需要內置服務器證書,用來驗證所連接的服務器是否是指定的服務器。

2、單向認證、雙向認證

1)單項認證

iOS代碼中打開SSL驗證,保持原來的請求方法即可。

應該是網絡請求方法中自動驗證服務器端證書有效性。

2)雙向認證

需要購買SSL證書,并轉換成P12文件,導入工程目錄中

在請求類中添加如下三行代碼即可。

  // 這個是app bundle 路徑下的自簽證書  
  op.clientCertificate = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"testClient.p12"];  

  // 這個是自簽證書的密碼  
  op.clientCertificatePassword = @"testHttps";  
    
  // 由于自簽名的證書是需要忽略的,所以這里需要設置為YES,表示允許  
  op.shouldContinueWithInvalidCertificate = YES;  

注:目前雙向認證尚未親測通過,可能存在誤差。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容