加密解密技術基礎、PKI及創建私有私有CA

wKioL1cE59Wj2_y0AAJqfRK4UhU710.jpg


Linux基礎中的加密、解密及openssl
 數據爲什麼要加密?
      由於互聯網剛開始時使用的人非常少,在互聯網中交流信息的人都比較“單純”幾乎沒有安全問題;但隨着互聯網的快速發展,整個互聯網中涌入了大量的用戶,正所謂林子大了什麼鳥都有,隨之而來的就是數據的安全性得不到保障;因此就有了對數據的加密及解密。
 
安全的目標
       信息加密的目的是爲了確保所傳輸的信息具有保密性,不被其他人所劫持後篡改信息;如果被篡改後接收方也應該能知道,而且也應該確保沒被劫持的信息接收方可以讀取。
 
加密算法
       加密在很早之前就已經存在。遠在計算機還沒問世之前世界上就已經出現了,例如中國古代的虎符和信牌,或者礬書等。到現在爲止密碼或加密技術已經廣泛應用在生活中的各種場景中,尤其是在這個互聯網時代中加密技術更是發展到了極致

對稱加密
       通信雙方使用同一個密鑰對明文進行加密和解密。這樣就確保了就算是通信的信息被第三方知道,由於沒有密鑰也不能解密被加密的信息;這種加密方法確保了數據的安全性,但使用的密鑰必須由安全的方式在兩方之間傳輸。        
 
公鑰加密
       公鑰加密也稱非對稱加密,密鑰分爲私鑰和公鑰。其中公鑰是從私鑰中提取的。而且加密解密的方式是:公鑰加密必須用與之對應的私鑰來解密,反之亦然;
  一般私鑰只有加密者本身具有,對應的公鑰所有人都可以得到。公鑰加密主要可以實現對身份的驗證。例如,A用私鑰加密一個文件要送給B,B接受到後只有用與A的私鑰相對於的公鑰解密,如果能解密則說明這個文件是A發送的。
 
單向加密
      單向加密的特點是隻能加密不能解密。而且這種加密算術也稱爲hash散列函數,這種算法會把不同長度的數據壓縮成固定長度的一段字符。
  這種加密方法一般用來驗證數據的完整性。發送方用單向加密加密數據後會得到一個特徵碼,接收方收到數據後也用同樣的算法加密數據也得到一個特徵碼。把這兩個特徵碼作比較如果相同則說明數據沒有被改動過。
轉自【IT精英團】:http://www.itnpc.com/news/web/145238462635582.html



    加密算法和協議:

    對稱加密:數據加密(保密性),(3DES,AES)

    公鑰加密:身份認證、密鑰交換、數據加密(不常用,比對稱加密要慢3個數量級),(RSA,DSA)

    單向加密:數據完整性,(MD5, SHA1, ...)

    密鑰交換: RSA,DH(迪菲-赫爾曼),ECDH(橢圓曲線DH),ECDHE(臨時橢圓曲線DH)

    

    

    SSL/TLS

    SSL: 安全套接字層(ssl 1.0, ssl 2.0, ssl 3.0)

    TLS:傳輸層安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)

wKioL1cE8tqTidPmAAIhIl2lL2k910.jpg

一、SSL協議的握手過程

開始加密通信之前,客戶端和服務器首先必須建立連接和交換參數,這個過程叫做握手(handshake)。

假定客戶端叫做愛麗絲,服務器叫做鮑勃,整個握手過程可以用下圖說明(點擊看大圖)。

wKiom1cE9C2BDUETAABGHyEe4fQ605.png

握手階段分成五步。

第一步,愛麗絲給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支持的加密方法。

第二步,鮑勃確認雙方使用的加密方法,並給出數字證書、以及一個服務器生成的隨機數(Server random)。

第三步,愛麗絲確認數字證書有效,然後生成一個新的隨機數(Premaster secret),並使用數字證書中的公鑰,加密這個隨機數,發給鮑勃。

第四步,鮑勃使用自己的私鑰,獲取愛麗絲髮來的隨機數(即Premaster secret)。

第五步,愛麗絲和鮑勃根據約定的加密方法,使用前面的三個隨機數,生成"對話密鑰"(session key),用來加密接下來的整個對話過程。

SSL Handshake Protocol:

第一階段:ClientHello:

支持的協議版本,比如tls 1.2;

客戶端生成一個隨機數,稍後用戶生成“會話密鑰”

支持的加密算法,比如AES、3DES、RSA;

支持的壓縮算法;

第二階段:ServerHello

確認使用的加密通信協議版本,比如tls 1.2;

服務器端生成一個隨機數,稍後用於生成“會話密鑰”

確認使用的加密方法;

服務器證書;

第三階段:驗正服務器證書,在確認無誤後取出其公鑰;(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表)

發送以下信息給服務器端:

一個隨機數;

編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;

客戶端握手結束通知;

第四階段:收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話所有到的“會話密鑰”;

向客戶端發送如下信息:

編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;

服務端握手結束通知;


Linux系統上的隨機數生成器:

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

/dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟件生成僞隨機數,非阻塞;

僞隨機數不安全;

熵池中隨機數的來源:

硬盤IO中斷時間間隔;

鍵盤IO中斷時間間隔;

    PKI是Public KeyInfrastructure的首字母縮寫,翻譯過來就是公鑰基礎設施;PKI是一種遵循標準的利用公鑰加密技術爲電子商務的開展提供一套安全基礎平臺的技術和規範。

    PKI:公鑰基礎設施

簽證機構:CA

註冊機構:RA

證書吊銷列表:CRL

證書存取庫


           CA是PKI的核心,負責管理PKI結構下的所有用戶的證書。通信雙方認證對方身份必須要通過CA。
    常用的證書格式是 x509 格式,它包含有下面的信息:
    版本號(version)
    序列號(serial number),CA 用於唯一標誌此證書
    簽名算法標誌(signatur algotithm ientifier)
    發行者的名稱,即 CA 自己的名稱
    有效期,起始日期和終止日期
    主體自己的公鑰
    發行商的唯一標識
    整數主題的唯一標誌
    擴展信息
    簽名:CA 對此證書的數字簽名


wKioL1cE_Sjj7OqpAAOOz9F3K-g160.jpg


ssl組件:

libcrypto, libssl主要由開發者使用;

openssl:多用途命令行工具;


openssl:

從多子命令,分爲三類:

標準命令

消息摘要命令(dgst子命令)

加密命令(enc子命令)


標準命令: enc, ca, req, genrsa, ...


對稱加密:

工具: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


單向加密:

工具:openssl dgst, md5sum, sha1sum, sha224sum, ...


dgst命令:

~]# openssl  dgst  -md5  /PATH/TO/SOMEFILE


生成用戶密碼:

工具:passwd, openssl  passwd


openssl  passwd  -1  -salt  SALT


生成隨機數:

工具:openssl  rand


~]# openssl  rand  -hex  NUM

~]# openssl  rand  -base  NUM


公鑰加密:

加密解密:

算法:RSA,ELGamal

工具:openssl  rsautl, gpg

數字簽名:

算法:RSA, DSA, ELGamal

工具:

密鑰交換:

算法:DH



生成私鑰:

 ~]# (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)

提出公鑰:

 ~]#  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout


建立私有CA:


openssl命令:

配置文件:/etc/pki/tls/openssl.cnf


構建私有CA:

在確定配置爲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;

(3) 爲CA提供所需的目錄及文件;

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

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

~]# echo  01 > /etc/pki/CA/serial


要用到證書進行安全通信的服務器,需要向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

(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


吊銷證書:

步驟:

(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章