SSL/TLS協議及Openssl工具的實現
前言
早期網際網路資料傳輸是基於TCP/IP模型完成資料交換,其各層對傳輸的資料包進行各協議的封裝,從資料的傳送方到接收方進行的資料交換都是基於明文傳輸。在傳輸的過程中資料的可以被中間人進行攔截或抓取,威脅了資料的保密性(竊聽、通訊量分析)、資料的完整性(更改、偽裝、重放、否認)、資料的可用性攻擊(拒絕服務DOS及DDOS)。為了了達到安全,出現了技術的解決方案:加密和解密來抵禦攻擊。
加密和解密演算法和協議
1、對稱加密:
- 特性:
- 1、加密和解密使用同一金鑰,但雙方加密演算法可以不同
- 2、將原始資料分割成固定大小塊,逐個進行加密
- 3、加解密速度比較快
- 缺點:
- 1、金鑰過多
- 2、金鑰分發困難
- 用途:
- 常見用於資料傳輸過程中的資料加密,
- 常見演算法:
DES
: Data ,基於64位明文產生64個密文,或者64位密文產生64位明文3DES
: triple DESAES
: 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、數字簽名
數字簽名及金鑰交換過程說明:
- 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團隊
文章出處:運維部落