1. 程式人生 > >詳解SSL/TLS TLS 與HTTPS

詳解SSL/TLS TLS 與HTTPS

詳解SSL/TLS

TLS 與HTTPS

1 概述

TLS 是進行 HTTPS 連線的重要環節,通過了 TLS 層進行協商,後續的 HTTP 請求就可以使用協商好的對稱金鑰進行加密

SSL 是 Netscape 開發的專門用來保護 Web 通訊,目前版本為 3.0。TLS 是 IETF 制定的新協議,建立在 SSL 3.0 之上。所以 TLS 1.0 可以認為是 SSL 3.1

TLS(Transport Layer Security Protocol) 協議分為兩部分

  • TLS 記錄協議
  • TLS 握手協議

2 基礎

2.1 加密

2.1.1 對稱金鑰加密

編碼和解碼使用同一個金鑰,e = d

加密演算法有

  • DES
  • Triple-DES
  • RC2
  • RC4(在 OkHttp 2.3 已經下降支援)

位數越多,列舉攻擊花費的時間越長

痛點:傳送者和接收者建立對話前,需要一個共享金鑰

2.1.2 非對稱金鑰加密

兩個金鑰,一個加密,一個解密。私鑰持有,公鑰公開

  • RSA

破解私鑰的難度相當於對極大數進行因式分解

RSA 加密系統中,D 和 E 會相互抵消

  1. E(D(stuff)) = stuff

  2. D(E(stuff)) = stuff

所以具體哪個是私鑰,哪個是公鑰是由使用者選擇的

2.2 數字簽名

加了密的校驗和

  • 證明是原作者,只有原作者可以私鑰來進行加密
  • 證明沒有篡改,中途篡改校驗和就不再匹配

校驗和使用摘要演算法生成,比如 MD5,SHA

2.3 數字證書

受信任組織擔保的使用者或公司的資訊,沒有統一的標準

服務端大部分使用 x509 v3 派生證書,主要資訊有

欄位 舉例
證書序列號 12:34:56:78
證書過期時間 Wed,Sep 17,2017
站點組織名 Lynch
站點DNS主機名 lynch-lee.me
站點公鑰 xxxx
證書頒發者 RSA Data Security
數字簽名 xxxx

服務端把證書(內含服務端的公鑰)發給客戶端,客戶端使用頒佈證書的機構的公鑰來解密,檢查數字簽名,取出公鑰。取出服務端的公鑰,將後面請求用的對稱金鑰 X 傳遞給服務端,後面就用該金鑰進行加密傳輸資訊

3 TLS 原理

HTTPS 是在 HTTP 和 TCP 之間加了一層 TLS,這個 TLS 協商了一個對稱金鑰來進行 HTTP 加密

img_https.png

同時,SSL/TLS 不僅僅可以用在 HTTP,也可以用在 FTP,Telnet 等應用層協議上

SSL/TLS 實際上混合使用了對稱和非對稱金鑰,主要分成這幾步

  • 使用非對稱金鑰建立安全的通道
    • 客戶端請求 Https 連線,傳送可用的 TLS 版本和可用的密碼套件
    • 服務端返回證書,密碼套件和 TLS 版本
  • 用安全的通道產生併發送臨時的隨機對稱金鑰
    • 生成隨機對稱金鑰,使用證書中的服務端公鑰加密,傳送給服務端
    • 服務端使用私鑰解密獲取對稱金鑰
  • 使用對稱金鑰加密資訊,進行互動

簡單的過程如下

SSL/TLS分析

 本文分為六個部分,詳見思維導圖。

技術分享

一、SSL/TLS作用

 在瞭解作用前,先介紹什麼是SSL/TLS?SSL(Secure Sockets Layer)即安全套接字層,保障internet資料傳輸的安全性。TLS(Transport Layer Security)即安全傳輸層協議,保障應用程式之間通訊的安全性。

 要了解SSL/TLS的作用要從網路通訊風險著手,所以總結出了三大風險及其對應的解決方案。

技術分享

二、歷史

    技術分享

三、必須掌握的一些密碼學的概念

技術分享

  下面是密碼學中的概念介紹。

技術分享

四、SSL/TLS基本運作過程

技術分享

五、握手階段的詳細過程

  客戶端服務端安全加密通訊有四次握手的過程,握手過程出現在上面運作流程的前兩個階段。握手過程是這樣的。

技術分享

 第一次握手也稱為ClientHello,即客戶端像服務端問好。這可不是簡單的問好,這次問好包含了大量的資訊。資訊如下:

    技術分享   

 第二次握手也稱為serhello,即服務端向客戶端問好。同樣,這也不是簡單的問好,也包含的大量的資訊。資訊如下:

   技術分享 

 第三次握手為客戶端迴應。資訊如下:

技術分享

 第四次握手為服務端最後的迴應,資訊如下:

技術分享

六、OpenSSL

 OpenSSL是SSL的開源實現方案。我將介紹如下的內容。

技術分享

 6.1 簡介

  OpenSSL是一個開放原始碼的軟體庫包,應用程式可以使用這個包來進行安全通訊,避免竊聽,同時確認另一端連線者的身份。

 6.2 元件

  OpenSSL由以下三部分組成。libcryto這是一個具有通用功能的加密庫;libssl是實現SSL機制的安全通訊加密庫,實現TLS/SSL功能。通過libssl可以實現遠端執行程式命令,傳輸檔案等等。XSHELL,SecureCRTP,putty工具就是呼叫了這個庫實現遠端控制主機的功能;openssl是個多功能命令列工具、他可以實現加密解密、甚至還可以 當CA來用、可以讓你建立證書、吊銷證書。

技術分享

 6.3 加密演算法和協議

  在這一小節,我瞭解以下四部分的資訊。

技術分享

 6.3.1 單向加密

  單向加密演算法的介紹以及特性如圖所示。MD5加密演算法即為有名的數字摘要演算法。簡單理解MD5演算法簡單的來說就是把任意長度的字串變換成固定長度(通常是128位)的16進位制串。

  MD5的功能有:(1)一致性驗證(2)數字簽名(3)密碼儲存

  (1)一致性驗證,簡單理解就是檢驗是否一致,比如說,你從網上下載一個檔案,網站會給出這個檔案的MD5值,通過這個MD5值來比對下載前原始檔與下載後的檔案是否一致。

  (2)數字簽名,簡單理解就是通過MD5演算法實現的簽名,作用是驗證身份。

   參考連結:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

  (3)密碼儲存,很好理解,就是將密碼通過MD5演算法加密儲存。

  SHA1加密演算法會產生一個160位的訊息摘要,由於SHA1演算法的雪崩效應(改變一位訊息資料會使輸出值大幅度變動)與不可逆性,可用於驗證資料完整性與訊息驗證。由於對安全加密的要求性更高,後來又出現了更為複雜的SHA224,256,384,512演算法,其主要區別就是加密位數和安全性更高。

技術分享

 6.3.2 對稱加密

  我將介紹對稱加密下面三個部分。主要介紹下實現對稱加密的命令 openssl enc。

  在linux系統環境下你也可以使用man openssl檢視openssl用法,其次你可以通過openssl enc help檢視命令選項以及引數。    

技術分享

技術分享

  對稱加密命令openssl的實踐應用(CentOS7.3實驗環境)

  說明:示例為加密/etc/fstable檔案以及解密對應的檔案

  第一步:對/etc/fstab檔案進行加密

    說明:將/etc/fstab檔案加密為fstab.ciphertxt檔案

技術分享

  第二步:對fstab.ciphertxt檔案解密

    說明:將fstab.ciphertxt檔案解密為當前目錄的fstab檔案

技術分享

 第三步:測試加密檔案

    說明:用cat命令檢視fstab.ciphertxt加密檔案,出現亂碼;而檢視解密的fstab檔案則顯示正確資訊,由此證明加密以及解密成功。

技術分享技術分享

 6.3.3 公鑰加密

技術分享

  公鑰加密特性及用途如圖所示:

技術分享

 有關RSA演算法的介紹請戳這裡:

 下面重點介紹RSA金鑰的生成方法

  在linux環境下你也可以使用man openssl,其次你可以通過openssl genrsa help檢視命令選項以及引數。

  私鑰公鑰生成的一次實踐

    第一步:在linux環境CA中心生成私鑰    

    (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey_new.pem 4096)

技術分享

    第二步:提取公鑰

技術分享

 6.3.4 公鑰基礎設施(pki)

  PKI(Public Key Infrastructure)翻譯過來就是公鑰基礎設施,簡單理解就是利用公鑰技術對應用加密解密的基礎設施。它是一個提供安全服務的基礎設施,是CA的配置服務設定,同時也是電子商務的關鍵和基礎技術。

  RA(Registration Authority)翻譯過來就是註冊授權中心。RA是證書註冊審批系統,該系統具有證書的申請、審批、下載、OCSP、LDAP等一系列功能,為整個機構體系提供安全認證服務。

 CRL(Certificate Revocation List )證書吊銷列表。當你的證書過期了,就被吊銷。這是一個由 CA 維護併發布的列出已被吊銷的證書的文件。為確保其完整性,CRL 是用 CA 的私鑰簽署的。

 證書存取庫,即存取證書的一個庫。

 X.509v3,定義了證書的結構以及認證協議標準。包括但不僅限於以下內容:

    版本號

    序列號

    簽名演算法ID

    發行者名稱

    有效期限

    主體名稱

    主體公鑰

    發行者的惟一標識

    主體的惟一標識

    擴充套件

    發行者的簽名

6.4 OpenSSL命令

技術分享

 接下來詳細介紹openssl命令,重點放在命令的實踐上。

 6.4.1 型別

 openssl命令按照我自己的理解分為了三種命令型別:標準命令,訊息摘要命令以及加密命令。

 標準命令有:enc, ca, req, genrsa等等。命令的介紹你可以在linux系統中通過man openssl檢索關鍵字獲取。 

     enc負責密碼編碼與加密

    ca負責證書認證管理。

    req負責證書請求檔案的管理。

    genrsa負責生成RSA的私鑰。

 下面我們來看openssl命令的用法。

 6.4.2 用法

 openssl命令的應用之一是生成使用者密碼。應用工具或者你可以稱為命令有:

    passwd, openssl passwd

    paswwd是普通的加密方式,但實際上也足夠安全了。

    openssl passwd採用雜湊演算法進行加密。

 生成隨機數採用的工具是openssl rand,你可以通過man sslrand採用命令的用法。

  兩個例子

    openssl  rand  -hex  NUM 

     -hex表示每個字元為十六進位制,相當於4位二進位制,NUM表示隨機數的位元組數,出現的字元數為NUM的兩倍。

    技術分享

    openssl  rand  -base  NUM

    -base表示每個字元為64為64機制的字元,NUM表示隨機數的位元組數,出現的字元數同樣為為NUM的兩倍。

技術分享

    linux系統上有隨機數的生成器裝置

        /dev/random裝置:僅從熵池返回隨機數;隨機數用盡,阻塞;

        /dev/urandom裝置:從熵池返回隨機數;隨機數用盡,會利用軟體生成偽隨機數,非阻塞,產生的偽隨機數不安全。

     那熵池的隨機數的來源從何而來,主要從這兩方面而來:        

        硬碟IO中斷時間間隔;

        鍵盤IO中斷時間間隔;

 6.4.2.4 CA介紹

    技術分享

  CA內容介紹分為以上四個部分。

  CA(Certificate Authority)即數字證書認證機構,CA的型別有公有CA和私有CA。公有CA即公有數字證書認證機構,特點是權威安全。私有CA即私有的數字證書認證機構,私人擁有的,一般來說,安全性就有待考量了。下面我們來建立一個私有CA來玩玩。

技術分享

 CA的配置檔案是/etc/pki/tls/openssl.cnf,你可以編輯配置檔案對私有CA配置做出相應地修改。

 建立私有CA的思路是這樣的:在CA主機上生成一個私鑰以及一個自簽證書,併為CA提供所需要的目錄及檔案。

 接下來介紹建立私有CA的步驟 

    1.建立所需要的檔案以及目錄        

         touch /etc/pki/CA/{serial,index.txt} 生成證書索引資料庫檔案

        echo 01 > /etc/pki/CA/serial 指定第一個頒發證書的序列號

        mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts} 

         建立證書,證書吊銷,新證書目錄

    2.生成一個基於RSA演算法的私鑰

        cd /etc/pki/CA/

        (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

    3. 生成自簽名的證書         

        openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out             /etc/pki/CA/cacert.pem -days 3655

    引數說明

        req:負責證書請求檔案的管理        

        -new: 生成新證書籤署請求

        -x509: 專用於CA生成自簽證書

        -key: 生成請求時用到的私鑰檔案

        -days n:證書的有效期限

        -out /PATH/TO/SOMECERTFILE: 證書的儲存路徑

 建立CA的實踐(詳細請參照上面步驟)

    touch /etc/pki/CA/{serial,index.txt}

    echo 01 > /etc/pki/CA/serial

    mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}    

    cd /etc/pki/CA/

     (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

    成功建立RSA私鑰

    技術分享

    openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out            /etc/pki/CA/cacert.pem -days 3655

技術分享

    分別輸入你的國家,省份,城市,公司,部分,伺服器地域名以及郵箱地址。這樣一個私有的CA就建立成功了。私有CA證書路徑為/etc/pki/CA/cacert.pem,如果其他伺服器想認證這個證書只要取得這個證書檔案即可。

 接下來在上面實驗的基礎上再介紹一個簽署證書的示例

技術分享

簽署證書的思路如上圖所示,我們只需要按照步驟來實踐即可。

    注:(本示例主要以httpd服務為例,因為模擬建立一個基於https的站點要用到)

    (1)主機A生成私鑰        

     mkdir  /etc/httpd/ssl  #建立儲存私鑰的目錄

     cd  /etc/pki/CA     #注意:只有再CA目錄中才能生成私鑰

    (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)

    技術分享

    (2) A主機生成證書籤署請求

       openssl  req  -new  -key  /etc/httpd/ssl/httpd.key  -out                  /etc/httpd/ssl/httpd.csr  -days  365

技術分享

    填上相應的資訊,注意國家,省份,城市,公司,部門資訊應該保持一致,才能合理地簽署請求。

    (3) 將請求傳送給CA主機B

      mkdir /CA_csr        #建立儲存CA簽署請求的目錄

      scp /etc/httpd/ssl/httpd.csr   CA主機IP:/CA_csr

    (4) 在CA主機B上籤署證書

      openssl ca  -in  /CA_csr/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days  365

技術分享

    通通選擇y,表示選擇同意簽署證書。

    (5)將簽署的證書傳送給需要授權的主機   

      scp /etc/pki/CA/certs/httpd.crt 目標主機ip:/etc/httpd/ssl/

技術分享

    成功將簽署的證書傳送給主機A。                

    (6)檢視證書中的資訊(CA主機B中)

     openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject

技術分享

 吊銷證書步驟

    A 在客戶端獲取要吊銷的證書的serial               

        opensslx509 -in /PATH/FROM/CERT_FILE-noout -serial -subject    

    B 在CA上,根據客戶提交的serial與subject資訊,對比檢驗是否與index.txt檔案中的資訊一致,吊銷證書:

        opensslca -revoke /etc/pki/CA/newcerts/SERIAL.pem    

    C 指定第一個吊銷證書的編號

        注意:第一次更新證書吊銷列表前,才需要執行

        echo 01 > /etc/pki/CA/crlnumber   

    D 更新證書吊銷列表

        opensslca -gencrl-out /etc/pki/CA/crl/crl.pem

        檢視crl檔案:

        opensslcrl-in /etc/pki/CA/crl/crl.pem-noout-text