安全加密與證書籤發工具--openssl
寫在前面:
部落格書寫牢記5W1H法則:What,Why,When,Where,Who,How。
本篇主要內容:
● 安全協議
● 資料安全問題及解決方案
● 金鑰演算法及通訊過程
● 使用OpenSSL命令列工具建立私有CA、簽發證書、維護crl證書吊銷列表
回顧:
資源子網:關注資料包組成(應用軟體)
通訊子網:關注資料傳輸過程(linux核心來實現)
TCP/IP:
應用層協議:http/ftp...
傳輸層協議:tcp/udp/sctp
網際網路層協議:ipv4/ipv6
物理層:ppp,乙太網
主機通訊:
本機不同程序:IPC,message queue,shm,semerphor
不同主機程序
不同主機通訊需要先連線到port,進而找到通訊程序,所以port是被程序獨佔的。程序使用埠需向核心註冊使用。
不同主機通訊,服務端埠必須一直處於監聽(listen)狀態以供客戶端訪問。而客戶端通過約定俗成來找到常見服務的埠(如http服務的80埠,訪問時不必明確指出);通過DNS服務來找到服務端IP地址。
埠分配:
1-1024:系統服務佔用(如80、22、21、)
< 4W :半隨機,有一些不太常見的服務佔用(mysql 3306,oracle 1521)
> 4W :隨機
安全協議:
SSL:Secure Sockets Layer(安全套接字層)
版本:V1.0 V2.0 V3.0(現用)
TLS:Transport Layer Security(傳輸層安全)
IETF:1999年
V1.0 V1.1 V1.2(現用) V1.3
SSL、TLS協議分層設計:
1、最底層:基礎演算法原語的實現,aes, rsa, md5
2、向上一層:各種演算法的實現;
3、再向上一層:組合演算法實現的半成品;
4、用各種元件拼裝而成的各種成品密碼學協議軟體;
SSL、TLS協議是一個公共功能庫,在傳輸層與應用層之間的半層。當應用程式呼叫時使用,不呼叫則不使用。
如:http服務呼叫SSL或TLS功能庫之後,就轉換成了安全的https服務了。
安全的目標:
保密性:confidentiality
完整性:integrity
可用性:availability
***型別;
威脅保密性:竊聽、通訊量分析
威脅完整性:更改、偽裝、重放、否認(通訊中的一方)
威脅可用性:拒絕服務(DoS)
解決方案:
(1)技術上:
加密解密:
使用某種演算法得到非明文資訊,而參與演算法的一串字元即為密碼。
傳統加密方法:
替代加密演算法、置換加密演算法
現代加密方法:
現代塊加密方法:
將整個資料分割成多個塊,單獨進行加密,進行復雜的運算,使得必須得到全部資料和密碼才能夠解密。
(2)服務:
使用安全服務,可抵禦***的服務。
認證機制
訪問控制機制
金鑰演算法和協議
金鑰演算法和協議
為了解決加密解密傳輸過程中,密碼交換過程的安全的服務。
對稱加密:
特點:
(1) 加密解密使用同一個金鑰
(2) 將原始資料分隔成為固定大小的塊,逐個進行加密
缺陷:
(1) 金鑰過多(對伺服器端來說,會產生大量金鑰)
(2) 金鑰分發困難
常用演算法:
DES:Data Encryption Standard(已不安全)
3DES:Triple DES(64bits)
AES:Advanced Encryption Standard(128bis、192bits、256bits、384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
非對稱加密
特點:
成對出現公鑰和私鑰;
公鑰加密,必須用私鑰解密;
私鑰加密,必須用公鑰解密。
公鑰:
從私鑰中提取產生,可公開給所有人,pubkey。
私鑰:
通過工具建立,使用者留存,必須保證私密性,secret key。
用途:
數字簽名:
私鑰加密,公鑰解密。用於使接收方確認傳送方身份。
金鑰交換IKE(Internet Key Exchange):
公鑰加密,私鑰解密。傳送方使用對方公鑰加密一個對稱加密金鑰,併發送給對方。
金鑰交換也可以使用DH(Deffie-Hellman)來實現
資料加密:
常用演算法:
RSA:可用於簽名和加解密
DSA:僅簽名
ELGamal
非對稱加密方式通訊過程:
單向加密
特徵:
提取資料指紋。只能加密,不能解密
定長輸出
雪崩效應。初始結果的微小改變導致結果的巨大變化
功能:
完整性驗證
常用演算法:
md5:Message Digest 5,128bits定長輸出
sha1:Secure Hash Algorithm 1,160bits定長輸出,即40個字母數字的組合
sha224/sha256/sha384/sha512
認證協議
金鑰交換
常用演算法:
RSA
公鑰加密
DH
此演算法通過隨機大質數的數學演算法得到,不會將密碼在網際網路上傳送,比公鑰加密的方式更具優勢。
ECDH(橢圓曲線DH)
ECDHE(臨時橢圓曲線DH)
CA:
非對稱加密的過程中,由於通訊雙方互不認識,為了正確的獲得對方的公鑰,防止中間人***,我們需要一個雙方都認可的第三方來認證,而這個第三方就是CA。
CA為通訊雙方簽發證書(證書中含有公鑰),為雙方身份提供擔保。
PKI:Public Key Infrastructure
即公鑰基礎設施
組成部分:
簽證機構:CA
註冊機構:RA
證書吊銷列表:CRL
證書存取庫:
X.509v3:
定義了證書結構及認證協議標準
版本號:X.509目前有3個版本,最多用的是v3版本
序列號:本章證書是CA簽發的第多少張證書
簽名演算法ID:數字簽名中單向加密所使用的演算法
發行者名稱:CA的名稱
有效期限
主體名稱
主體公鑰
發行者的唯一標識
主體的唯一標識
擴充套件資訊
發行者簽名
SSL會話步驟:
(1) 客戶端向伺服器端索要並驗證證書;
(2) 雙方協商生成“會話金鑰”;
(3) 雙方採用“會話金鑰”進行加密通訊;
其中1、2步驟為握手階段(Handshake)
SSL Handshake Protocol:
第一階段:ClientHello:
支援的協議版本,比如tls 1.2;
客戶端生成一個隨機數,稍後使用者生成“會話金鑰”
支援的加密演算法,比如AES、3DES、RSA;
支援的壓縮演算法;
第二階段:ServerHello
確認使用的加密通訊協議版本,比如tls 1.2;
伺服器端生成一個隨機數,稍後用於生成“會話金鑰”
確認使用的加密方法;
伺服器證書;
第三階段:
驗正伺服器證書,在確認無誤後取出其公鑰;(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表)
傳送以下資訊給伺服器端:
一個隨機數;
編碼變更通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送;
客戶端握手結束通知;
第四階段:
收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話所有到的“會話金鑰”;
向客戶端傳送如下資訊:
編碼變更通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送;
服務端握手結束通知;
linux系統上金鑰演算法和協議的實現工具:
GPG(pgp)
OpenSSL(ssl)
組成:
libencrypto:庫,加密解密演算法的實現
libssl:庫,SSL半層功能庫的實現,用於通訊
openssl:命令列工具
openssl命令列工具實現金鑰演算法與協議:
openssl
子命令:
標準命令
enc, ca, req, genrsa, ...
訊息摘要命令
dgst子命令
加密命令
enc子命令
實現對稱加密:
工具:openssl enc
其他工具:gpg
支援的演算法:3des, aes, blowfish, towfish
enc命令:
加密:
~]# openssl enc -e -des3 -a -salt -in FILE -out FILE_AFTER_ENC
解密:
~]# openssl enc -d -des3 -a -salt -out FILE -in FILE_AFTER_ENC
實現單向加密:
工具:openssl dgst
其他工具:md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
生成使用者密碼:
工具:openssl passwd
其他命令:passwd命令
命令:
~]# openssl passwd -1 -salt SALT
生成隨機數:
工具:openssl rand
命令:
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
公鑰加密:
加密解密:
演算法:RSA,ELGamal
工具:openssl rsautl, gpg
數字簽名:
演算法:RSA, DSA, ELGamal
工具:openssl rsautl, gpg
金鑰交換:
演算法:DH
生成金鑰對:
生成私鑰:
~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
NUM_BITS為2的n次方
提出公鑰:
~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
建立私有CA:
工具:openssl、OpenCA
配置檔案:/etc/pki/tls/openssl.cnf
定義了證書目錄、序列號檔案、資料庫檔案等等
目標:
在確定配置為CA的服務上生成一個自簽證書,併為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;
生成過程需要輸入一些資訊:
國家程式碼,省、城市、公司名、部門名、主機名、Email
(3) 為CA提供所需的目錄及檔案;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
serial為序列號儲存檔案,“01”將作為第一個CA簽發的證書的序列號,檔案為空時不能正確簽發證書。
其他需安全通訊的伺服器向CA請求籤發證書:
步驟:(以httpd為例)
(1) 用到證書的主機生成私鑰;
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
(2) 生成證書籤署請求
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
注意:這裡填寫的資訊應該與CA證書保持一致,主機名必須與外界訪問的域名相同。
(3) 將請求通過可靠方式傳送給CA主機;
(4) 在CA主機上籤署證書;
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
檢視證書中的資訊:
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(5) 將證書通過可靠方式發回給請求主機
吊銷證書:
步驟:
(1) 客戶端獲取要吊銷的證書的serial(在使用證書的主機執行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主機吊銷證書
先根據客戶提交的serial和subject資訊,對比其與本機資料庫index.txt中儲存的是否一致;
吊銷:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要換成證書真正的序列號;
(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
轉載於:https://blog.51cto.com/1036416056/1761565