1. 程式人生 > >SSL/TLS協議及Openssl工具的實現

SSL/TLS協議及Openssl工具的實現

前言

早期網際網路資料傳輸是基於TCP/IP模型完成資料交換,其各層對傳輸的資料包進行各協議的封裝,從資料的傳送方到接收方進行的資料交換都是基於明文傳輸。在傳輸的過程中資料的可以被中間人進行攔截或抓取,威脅了資料的保密性(竊聽、通訊量分析)、資料的完整性(更改、偽裝、重放、否認)、資料的可用性攻擊(拒絕服務DOS及DDOS)。為了了達到安全,出現了技術的解決方案:加密和解密來抵禦攻擊。

加密和解密演算法和協議

1、對稱加密:

  • 特性:
    • 1、加密和解密使用同一金鑰,但雙方加密演算法可以不同
    • 2、將原始資料分割成固定大小塊,逐個進行加密
    • 3、加解密速度比較快
  • 缺點:
    • 1、金鑰過多
    • 2、金鑰分發困難
  • 用途:
    • 常見用於資料傳輸過程中的資料加密,
  • 常見演算法:
    • DES : Data ,基於64位明文產生64個密文,或者64位密文產生64位明文
    • 3DES: triple DES
    • AES : advanced Encryption standard,採用128、192、256、384位加密機制
    • Blowfish
    • Twofish
    • IDEA
    • RC16
    • CAST5

2、非對稱加密(公鑰加密)

  • 特性:
    • 1、金鑰分為公鑰和私鑰,密碼都是成對出現。
    • 2、私鑰可以解公鑰加密的資料,公鑰也可以解私鑰加密的資料
    • 3、公鑰從私鑰中提取產生,可以公開給所有人,稱之為Public Key
    • 4、私鑰通過工具建立,使用者自己留存,必須保證其私密性,稱之為Secret Key
  • 缺點
    • 加解密速度慢,一般比對稱加密要慢3個量級(一個量級是10倍)
    • 中間人攻擊
  • 用途
    • 1、數字簽名
      • 主要用於讓接收方確認傳送方的身份
    • 2、金鑰交換
      • 傳送方使用公鑰加密一個對稱金鑰,併發送給對方
    • 3、資料加密

數字簽名及金鑰交換過程說明:

  • 1、傳送方使用單向加密演算法計算資料的特徵碼,用其私鑰加密特徵碼,並附加在資料後面,
  • 2、傳送方再使用對稱加密演算法生成金鑰,加密整個資料,並拿到對方的公鑰,加密對稱加密的密碼,傳送給對方
  • 3、對方收到後使用自己的私鑰解密,拿到對稱加密演算法的密碼,再使用密碼解密整個資料。

身份驗證機制的實現:傳送方使用自己的私鑰加密資料後,接收方拿對方釋出的公鑰解密其資料,這個過程被稱之為身份驗證

金鑰交換機制的實現: 傳送方使用對方的公鑰加密其密碼,接收方使用自己的私鑰解密後可以得到其密碼,這個過程被稱之為金鑰交換

  • 常見演算法
    • RSA : 能同時實現加密解密
    • DSS : Digital signarure standard
    • DSA : 只能實現簽名,不能實現加解密

3、單向加密

  • 特性:
    • 1、定長輸出
    • 2、雪崩效應
    • 3、只加密不能解密
  • 用途:
    • 實現資料的完整性驗證
  • 常見演算法:
    • MD5 : message digest5,固定128位的定長輸出
    • sha1 : secure hash algorithm ,固定160位的定長輸出
    • sha224,sha256,sha384,sha512

金鑰交換機制(IKE ,Internet Key Exchange)

  • 實現演算法:

    • RSA
    • ECDH(隨圓曲線DH)
    • ECDHE(臨時隨圓曲線DH)
    • 公鑰加密
    • DH(deffie-hellman)
  • DH交換金鑰的實現原理
      A: p,g (生成兩個大數)
      B: p,g(生成兩個大數)
    
      A: x(生成一個隨機數)
          --> p^x%g ---->(傳送給B)
      B: y(生成一個隨機數)
          -->p^y%g ----> (傳送給A)
    
      A:(p^y%g)^x == p^yx%g 
      B: (p^x%g) ^y == p^xy%g(算得的密碼都一樣)

為什麼會有CA機構的出現

由於基於公鑰和私鑰機制進行金鑰交換時,會有中間人攻擊的情況發生。故我們需要有一個第三方機構幫忙認證證書的真實性,不會被第三方利用。這個情況下,出現了簽證機構,即CA。

CA頒發證書的機制

  • 1、客戶生成相應的私鑰,並提取公鑰
  • 2、向CA機構傳送申請資訊,其中需要提供主體名稱、主體公鑰、主體的唯一標識,生成一個簽署請求檔案。
  • 3、CA機構對其提供的請求檔案提取特徵碼,使用自己的私鑰對特徵碼簽名,生成證書(證書中包含資訊請見以下)

PKI(Public infrastructure,公鑰基礎設施)

  • 四個元件組成
    • 簽證機構 : CA
    • 註冊機構 : RA
    • 證書吊銷列表 : CRL
    • 證書存取庫 : CB
  • 證書的基本格式(X.509標準)
    • 1、證書序列號
    • 2、序列號
    • 3、簽名演算法ID
    • 4、發行者名稱
    • 5、有效期限
    • 6、主體名稱
    • 7、主體公鑰
    • 8、發行者的唯一標識
    • 9、主體的唯一標識
    • 10、擴充套件
    • 11、發行者的簽名

加密通訊的實現協議

  • SSL (Secure socket layer)

    由網景公司研發,SSL協議位於TCP/IP協議與各種應用層協議之間,為資料通訊提供安全支援。SSL協議可分為兩層:SSL記錄協議(SSL Record Protocol):它建立在可選的傳輸協議(如TCP)之上,為高層協議提供資料封裝、壓縮、加密等基本功能的支援。SSL握手協議(SSL Handshake Protocol),它建立在SSL記錄協議之上, 用於在實際的資料傳輸之前,通訊雙方進行身份認證、協商加密演算法、交換加密金鑰等

    • 協議版本
      • V1.0
      • V1.2
      • V3.0
  • TLS (Transport layer security)

    TLS是開源SSL的實現,由IETF公司於1999年釋出,其支援多種演算法。TLS彩分層設計:

    • 最底層:基礎演算法原語的實現,AES,RSA,MD5
    • 向上一層: 各種演算法的實現
    • 再向上一層: 組合演算法實現的半成品
    • 再向上:用於各種元件拼裝而成的各種成品密碼學協議軟體
      • 協議版本:
        • V1.0
        • V1.1
        • V1.2(目前主流版本)
        • V1.3

Handshake握手過程(無需驗證客戶端證書)

動作 傳送方
Client hello Client
(2)Server Hello Server
(3)Certificate Server
(4)Server hello done Server
(5)Client Key Exchange Client
(6)Change cipher spec Client
(7)Finished Client
(8)Change cipher spec Server
(9)Finished Server
  • 1、TLS客戶端通過Client Hello訊息傳送所支援的TLS版本、加密演算法、壓縮演算法、金鑰交換演算法、MAC演算法等資訊傳送給TLS服務端
  • 2、TLS服務端確認本次通訊採用TLS版本加密通訊,並通過Server Hello訊息通知SSL客戶端,並將自己的公鑰資訊的數字證書傳送給TLS客戶端
  • 3、服務端傳送Server hello Done訊息,通知客戶端版本和加密套件協商結束,開媽進行金鑰交換
  • 4、客戶端驗證服務端的證書合法性後,利用證書中的公鑰加密客戶端隨機生成的premaster secret(隨機數字做為密碼),傳送給服務端
  • 5、客戶端傳送Change cipher spec訊息,通知服務端後續採用協議商好金鑰和加密方法進行加密和MAC計算
  • 6、客戶端計算已互動的所有握手資訊(除Change cipher spec訊息)進行Hash值計算,並使用協商好的金鑰進行加密Hash值,並通過Finished訊息傳送給伺服器,服務端利用同樣的方法計算已互動的握手訊息的Hash值,並與解密的Hash值比較,如果二者相同,則證明金鑰和加密套件協商成功
  • 7、同樣服務端也會發送Change cipher spec訊息,通知客戶端後續報文采用協商好的密碼和加密套件處理Hash值,客戶端利用同樣的方法計算已互動的握手訊息的Hash值,並與之對比,如果相同則證明金鑰和套件協商成功

Handshake握手過程(驗證客戶端的證書過程)

動作 傳送方
Client hello Client
(2)Server Hello Server
(3)Certificate Server
(4)Certificate Request Server
(5)Server hello done Server
(6)Certificate Client
(7)Client Key Exchange Client
(8)Certificate Verify Client
(9)Change cipher spec Client
(10)Finished Client
(11)Change cipher spec Server
(12)Finished Server

客戶端的身份驗證是可選的, 由伺服器決定是否驗證客戶端的身份(銀行網銀類似是需要驗證客戶端的身份)

  • 1、伺服器傳送Certficate Requset訊息,請求客戶端的證書
  • 2、客戶端通過Certificate訊息將攜帶自己的證書傳送給服務端
  • 3、服務端驗證該證書的合法性
  • 4、客戶端計算已互動的握手資訊、主金鑰的hash值,利用自己的私鑰對其進行加密,傳送給服務端
  • 5、服務端計算已互動的握手資訊,主金鑰的hash值,利用客戶端的公鑰解密後,進行hash值對比,如果相同則客戶端身份驗證成功

說明:change cipher spec訊息屬於SSL密碼變化協議,其他握手過程互動的訊息均屬於SSL握手協議,統稱為SSL握手訊息。計算Hash值,指的是利用Hash演算法(MD5或SHA)將任意長度的資料轉換為固定長度的資料

OpenSSL開源軟體

1、簡介

Openssl是開源軟體,各應用程式可以使用openssl進行安全通訊,避免竊聽、同時確認另一端連線者的身份,openssl被廣泛應用在網頁伺服器之上。其是C語言所寫,實現了基本的加密功能,也是SSL/TLS協議的應用實現。此軟體是以Eric Young以及Tim Hudson兩人所寫的SSLeay的分支,於1998年12月釋出第一個版本

2、Openssl的版本

  • V0.91c (1998年12月釋出)
  • V1.0.1 : 支援TLS v1.2(2012年3月釋出)
  • V1.0.2 (2015年1月釋出)

3、OpenSSL的組成部分:

  • 加密解密庫:Libencrypt,主要開發者使用
  • Libssl : 實現SSL安全通訊機制的庫
  • OpenSSL工具:多用途命令列工具

openssl加密工具

對稱加密工具:openssl enc

  • 加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher
  • 解密 :openssl enc -d -des3 -a -salt -out fstab -in fstab.cipher
      -e : 加密
      -d : 解密 
      -a : 以base64編碼進行輸出
      -salt : 加鹽
      -in :指定從那個檔案讀入
      -out : 輸出至那個檔案

單向加密工具:openssl dgst

  • openssl dgst -md5 fstab
      -md5 :指定演算法

生成使用者密碼:openssl passwd

  • openssl passwd -1 -salt 12345678
      -1 : 指定加密演算法
      -salt : 加鹽,並且為123456

生成隨機數:openssl rand

  • openssl rand -base64 10 (base64編碼格式)
  • openssl rand -hex 10 (16進位制編碼格式)
  • openssl passwd -1 -salt $(openssl rand -hex 4)

生成私鑰:openssl genrsa

  • openssl genrsa 1024 > /tmp/mykey.private
  • openssl genrsa 1024 -out /tmp/mykey.private 1024
  • (umask 077;openssl genrsa -out /tmp/mykey.private 1024)

提取公鑰:openssl rsa

  • openssl rsa -in /PATH/FROM/private.key -pubout
  • openssl rsa -in /PATH/FROM/private.key -pubout -out pub.key

檢視證書:opensll x509

  • openssl x509 -in httpd.crt -noout -serial -subject :只檢視序列號和subject

Openssl CA的工作目錄

  • /etc/pki/CA

Openssl配置檔案

  • /etc/pki/tls/openssl.cnf
    • $dir/certs : 簽發的證書存放位置
    • $dir/crl : 吊銷的證書存放位置
    • $dir/index.txt : 證書的索引資訊
    • $dir/serial : 索引序列號
    • $dir/private/cakey.pem : CA自己的私鑰
    • $dir/cacert.pem : CA公鑰位置
    • [req] : 此ID中定義了簽署證書的屬性

構建CA及簽發證書的步驟

########自建CA########
1、生成私鑰
    (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2、生成自簽證書
    openssl req -x509 -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
3、為CA提供所需的目錄及檔案
    mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
4、建立證書索引序列號
    echo 01 > /etc/pki/CA/serial

########客戶端生成私鑰及生成簽發證書請求########
1、到客戶端相應的目錄中,生成私鑰 
    mkdir /etc/httpd/ssl
    (umask 077; openssl genrsa -out httpd.key 2048)
2、生成簽署請求檔案(實為匯出公鑰資訊)
    openssl req -new -key httpd.key -out httpd.csr -days 365

########伺服器端簽署證書########
1、openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

#######拷貝簽署的檔案至客戶端指定目錄#######
1、cp /tmp/httpd/csr /etc/httpd/ssl

CA吊銷證書

1、客戶端獲取要吊銷證書的serial
2、CA端主機執行吊銷操作
    openssl ca -revoke /etc/pki/CA/newcert/SERIAL_ID(證書的真正序列號)
3、生成吊銷證書的吊銷編號(只是第一次吊銷證書時執行)
    echo 01 > /etc/pki/CA/crlnumber
4、更新證書吊銷列表
    openssl ca -gencrl -out thisca.crl

#####檢視crl檔案
openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

文/馬哥Linux團隊
文章出處:運維部落