加密解密技術基礎及用OpenSSL建立私有CA
1、加密解密技術基礎
(1)程序通訊
傳輸層協議有TCP,UDP,SCTP等,埠號port表示程序地址,程序向核心註冊獨佔使用某埠。
同一主機上的程序間通訊方式:程序間通訊(IPC), 訊息佇列(message queue),共享記憶體(shm), 旗語(semerphor)。
不同主機上的程序間通訊:socket,遠端過程呼叫(RPC)。
監聽模式:LISTEN (ip:port)
(2)安全及攻擊
安全的目標:保密性(confidentiality)、完整性(integrity)、可用性(availability)。
攻擊型別:
1)威脅保密性的攻擊:竊聽、通訊量分析;
2)威脅完整性的攻擊:更改、偽裝、重放、否認;
3)威脅可用性的攻擊:拒絕服務(DoS);
解決方案:技術(加密和解密)、服務(用於抵禦攻擊的服務,也即是為了上述安全目標而特地設計的安全服務)。
(3)加密和解密
傳統加密方法:替代加密方法、置換加密方法;
現代加密方法:現代塊加密方法。
服務:認證機制、訪問控制機制。
金鑰演算法和協議分為四類:對稱加密、公鑰加密、單向加密、認證協議。
(4)加密演算法和協議
1)對稱加密:加密和解密使用同一個金鑰;
DES:Data Encryption Standard;
3DES:Triple DES;
AES:Advanced Encryption Standard,(128bits, 192bits, 256bits, 384bits);
Blowfish、Twofish、IDEA、RC6、CAST5;
特性:
- 加密、解密使用同一個金鑰;
- 將原始資料分割成為固定大小的塊,逐個進行加密;
缺陷:
- 金鑰過多;
- 金鑰分發困難;
2)公鑰加密:金鑰分為公鑰與私鑰;
公鑰:從私鑰中提取產生,可公開給所有人,pubkey;
私鑰:通過工具建立,使用者自己留存,必須保證其私密性,secret key;
特點:用公鑰加密的資料,只能使用與之配對兒的私鑰解密;反之亦然。
用途:
數字簽名:主要在於讓接收方確認傳送方的身份;
金鑰交換:傳送方用對方公鑰加密一個對稱金鑰,併發送給對方;
資料加密:不常用,比對稱加密要慢3個數量級;
演算法:RSA, DSA, ELGamal;
DSS: Digital Signature Standard
DSA:Digital Signature Algorithm
3)單向加密:即提出資料指紋,只能加密,不能解密;
特性:定長輸出、雪崩效應;
功能:完整性;
演算法:
MD5:Message Digest 5,128bits;
SHA1:Secure Hash Algorithm 1,160bits;還有SHA224,SHA256,SHA384,SHA512。
4)金鑰交換: IKE(Internet Key Exchange)
- 公鑰加密;
- DH(Deffie-Hellman,迪菲-赫爾曼),ECDH(橢圓曲線DH),ECDHE(臨時橢圓曲線DH);
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
(5)PKI:Public Key Infrastructure,公鑰基礎設施
分為以下元件:
簽證機構(CA)、註冊機構(RA)、證書吊銷列表(CRL)、證書存取庫。
X.509v3定義了證書的結構以及認證協議標準:版本號、序列號、簽名演算法ID、發行者名稱、有效期限、主體名稱、主體公鑰、發行者的惟一標識、主體的惟一標識、擴充套件、發行者的簽名;
2、SSL
(1)SSL簡介
SSL(Secure sockets Layer,安全套接字層),是Netscape於1994年提出的,共有V1.0,V2.0,V3.0版本。TLS(Transport Layer Security,傳輸層安全),是IETF於1999年提出的,共有V1.0,V1.1,V1.2,V1.3版本。SSL V3.0版本被發現有重大漏洞,現在已基本不使用,現在使用的都是TLS。
SSL的分層設計:
- 最底層:基礎演算法原語的實現,aes, rsa, md5
- 向上一層:各種演算法的實現;
- 再向上一層:組合演算法實現的半成品;
- 用各種元件拼裝而成的各種成品密碼學協議軟體;
SSL協議的開源實現是OpenSSL,OpenSSL由三部分組成:libencrypto庫(主要由開發者使用),libssl庫(主要由開發者使用)和openssl多用途命令列工具。http + ssl --> https,Linux系統上的安全協議:OpenSSL(ssl協議的開源實現), GPG(pgp協議的開源實現)。
(2)SSL會話
SSL會話主要三步:
1)客戶端向伺服器端索要並驗正證書;
2)雙方協商生成“會話金鑰”;
3)雙方採用“會話金鑰”進行加密通訊;
SSL會話過程:
第一階段:ClientHello,傳送以下內容:
支援的協議版本,比如tls 1.2;
客戶端生成一個隨機數,稍後使用者生成“會話金鑰”;
支援的加密演算法,比如AES、3DES、RSA;
支援的壓縮演算法;
第二階段:ServerHello:
確認使用的加密通訊協議版本,比如tls 1.2;
伺服器端生成一個隨機數,稍後用於生成“會話金鑰”
確認使用的加密方法;
伺服器證書;
第三階段:
驗證伺服器證書,在確認無誤後取出其公鑰;(驗證以下內容:發證機構、證書完整性、證書持有者、證書有效期、吊銷列表);
傳送以下資訊給伺服器端:
一個隨機數;
編碼變更通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送;
客戶端握手結束通知;
第四階段:
收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話所有到的“會話金鑰”;
向客戶端傳送如下資訊:
編碼變更通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送;
服務端握手結束通知;
3、OpenSSL
(1)OpenSSL命令
OpenSSL有眾多子命令,分為三類:標準命令、訊息摘要命令(dgst子命令)和加密命令(enc子命令)。
標準命令: enc, ca, req, genrsa, …
(2)各種加密演算法及工具
1)對稱加密:
工具:openssl enc, gpg
支援的演算法:3des, aes, blowfish, towfish
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
2)單向加密:
工具:openssl dgst, md5sum, sha1sum, sha224sum, …
dgst命令:~]# openssl dgst -md5 /PATH/TO/SOMEFILE
3)生成使用者密碼:
工具:passwd, openssl passwd
命令:openssl passwd -1 -salt SALT
4)生成隨機數:
工具:openssl rand
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
5)公鑰加密解密:
演算法:RSA,ELGamal
工具:openssl rsautl, gpg
6)數字簽名:
演算法:RSA, DSA, ELGamal
工具:openssl rsautl, gpg
7)金鑰交換:
演算法:DH
工具:openssl rsautl, gpg
8)生成金鑰:
生成私鑰: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
提出公鑰: ~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
(3)Linux系統上的隨機數生成器
/dev/random:僅從熵池返回隨機數;隨機數用盡,阻塞;
/dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟體生成偽隨機數,非阻塞;偽隨機數不夠安全;
熵池中隨機數的來源:
1)硬碟IO中斷時間間隔;
2)鍵盤IO中斷時間間隔;
4、用OpenSSL搭建私有CA
(1)背景介紹
CA分為:公共信任的CA和私有CA;
建立私有CA可用工具:OpenSSL和OpenCA。
OpenSSL命令的配置檔案為:/etc/pki/tls/openssl.cnf。
構建私有CA是在確定配置為CA的服務上生成一個自簽證書,併為CA提供所需要的目錄及檔案即可。
(2)私有CA搭建步驟
1)生成私鑰:~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2)生成自簽證書:~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新證書籤署請求;
-x509:生成自籤格式證書,專用於建立私有CA時;
-key:生成請求時用到的私有檔案路徑;
-out:生成的請求檔案路徑;如果自籤操作將直接生成簽署過的證書;
-days:證書的有效時長,單位是day;
3)為CA提供所需的目錄及檔案;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
4)要用到證書進行安全通訊的伺服器,需要向CA請求籤署證書(以httpd為例):
- 用到證書的主機生成私鑰;
~]# mkdir /etc/httpd/ssl ~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
- 生成證書籤署請求
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
- 將請求通過可靠方式傳送給CA主機;
- 在CA主機上籤署證書;在CA主機上籤署證書:
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
5)檢視證書中的資訊:~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
6)吊銷證書:
- 客戶端獲取要吊銷的證書的serial(在使用證書的主機執行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
- CA主機吊銷證書:先根據客戶提交的serial和subject資訊,對比其與本機資料庫index.txt中儲存的是否一致;
吊銷命令:# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要換成證書真正的序列號; - 生成吊銷證書的吊銷編號(第一次吊銷證書時執行):
# echo 01 > /etc/pki/CA/crlnumber
- 更新證書吊銷列表:
# openssl ca -gencrl -out thisca.crl
- 檢視crl檔案:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text