1. 程式人生 > 實用技巧 >加解密技術基礎

加解密技術基礎

一、SSL協議

現代資訊流通中web佔了巨大的一部分,但是實際上web除了https協議支援的web伺服器,資訊對外都是透明的,現在流行的https全棧設計就是要擺脫資訊洩漏的危險。傳統的服務如http都是成熟已久的服務,為了減少不必要的麻煩,SSL(Secure Socket Layer)協議就應運而生了--在TCP/IP的應用層和網路層之間新增協議SSL子層(如下圖),程式設計師呼叫協議子層協議實現資料加密和傳輸。


wKioL1cRoMOS45yqAAAR5mWZzmg214.png

二、SSL協議會話會話過程

wKioL1cRyF3S6R5FAAGfZpqxe6A053.jpg

三、openssl基礎

單向加密:只能加密,不能解密。

工具:openssl dgest,mdsum,sha1sum,sha224sum等等

dgst命令:單向加密可以選定加密方法

openssldgst-md5/tmp/fstabMD5(/tmp/fstab)=85301c14005a7d9eae19ddfc3475131d#md5sum/tmp/fstab85301c14005a7d9eae19ddfc3475131d/tmp/fstab

公鑰加密:三種功能:加密解密,金鑰傳送,數字認證

1加密解密:

演算法:RSA,ELGamal

工具:openssl,rsautl,gpg

2.數字簽名:

演算法:RSA,DSA,ELGamal

工具:openssl,rsautl,gpg

3.金鑰交換:

演算法:DH

生成金鑰:

生成私鑰:~]#(umask 077;openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS )

提出公鑰:~]#openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout

#(umask077;opensslgenrsa-out/tmp/a.private1024)
GeneratingRSAprivatekey,1024bitlongmodulus...........................................................++++++....................++++++eis65537(0x10001)
#cat/tmp/a.pr
-----BEGINRSAPRIVATEKEY-----
MIICXgIBAAKBgQC5cLbUjCv9MELyHAndxltipdmvvtnMem6E9JZ7ymifMnggFHwbcRO3q03S6pTbdDKaBnMRulw9OQdvCOexm3Ym9P1jNLM6vNgGnROyWxWUoXZWd/YRG4WP0Lo2yvTdzXkNAwFL9S0wZTKfsFI3FYtV/432XA5vuI3olwgG8IJWhwIDAQABAoGBAKFf/TsqYH2NKjUXQV7F53EJc08FfvP694KsduhzVGh1uyPvr7ERzl7frHIHwlLX49E2G50p2GtO3bE6xqZA66euq8W4TefCVmKZm2P3c2Aj6HuRhVyKkFdZ7bZSjYDtGYjksTlzmHzC8g6Wzs3B3AHifuNU8oazqxINPObz5hABAkEA7P9oSBfhu8wm42r95UFqxWlwSRaYHyWSN4KQyM6IIWzjGFTSt4+DX4AUDGc9PpoB4l2HcnRctdU/RHn/54DxhwJBAMhPC2NzmGtiG1XW0uYfCXjmqF+iU79zQ/ikfVJRoEfZN4jPdTurCFxssbyQSJYnWxZTtM+4eS6F7mlKUabgswECQQDYwfB6n30R6fJXZW+50k75JypPbp7LPe2xX3VUc7EGATTi+BGRWWzqV5X+kh3tt6Wph6luAQcaN2OaGYr4DXLZAkBwVfQbGC74uhJ+d3XbXLihNypiR9UT337VKNqnmeN7p9Q/Q6mJhwevXb3n9DrhCr1IrjUO8XP0pWPpZKaaIhYBAkEAja39oNrqbvmBbmaanMfACTkf9CTgpjbfau63lArey1e0QJRz8I4wOZA/EEm9twvvNyYnUiiDJbTIwuY7xHwTyA==-----ENDRSAPRIVATEKEY-----#opensslrsa-in/tmp/a.private-puboutwritingRSAkey-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5cLbUjCv9MELyHAndxltipdmvvtnMem6E9JZ7ymifMnggFHwbcRO3q03S6pTbdDKaBnMRulw9OQdvCOexm3Ym9P1jNLM6vNgGnROyWxWUoXZWd/YRG4WP0Lo2yvTdzXkNAwFL9S0wZTKfsFI3FYtV/432XA5vuI3olwgG8IJWhwIDAQAB
-----ENDPUBLICKEY-----

Linux系統上的隨機數生成器

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

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

偽隨機數不安全;

熵池中隨機數的來源:

硬碟IO中斷時間間隔;複製大檔案到磁碟會有大量磁碟IO中斷

鍵盤IO中斷時間間隔;

五、CA

CA分為公共信任的CA,私有CA兩種,公有CA是外部機構建立的,申請即可,費用也不低。私有CA範圍有限,可以在公司內部建立,當然只能在公司內部使用,因為你的證書別人並不認可,缺乏權威。

搭建私有CA:以下兩種實現

openssl

OpenCA:開源CA

這裡講解openssl搭建私有CA:

openssl命令:

openssl的配置檔案:/etc/pki/tls/openssl.cnf ;其中部分配置定義了CA的配置。

[ca]段定義ca特性:ca怎麼管理ca,ca 工作環境

dir=/etc/pki/CA#Whereeverythingiskept工作目錄
certs=$dir/certs#Wheretheissuedcertsarekept已經簽發的證書位置
crl_dir=$dir/crl#Wheretheissuedcrlarekept吊銷證書列表
database=$dir/index.txt#databaseindexfile.各個已經頒發的證書索引,包含序列號
new_certs_dir=$dir/newcerts#defaultplacefornewcerts.對應certs目錄中的證書的
SERIAL.crtserial=$dir/serial#用於為ca提供證書序列號儲存位置
certificate=$dir/cacert.pem#指定CA自簽證書
private_key=$dir/private/cakey.pem#Theprivatekey.CA自身私鑰
default_days=365#預設的證書有效期

[req]段是request請求配置段,需要的認證單位個人向CA發出註冊簽署請求,這裡定義怎麼生成配置請求。

在確定配置為CA的服務上生成一個自簽證書,併為CA提供所需要的目錄及檔案即可:

步驟:

(1)生成私鑰;

~]#(umask077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

(2)生成自簽證書;man req即可

~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655 #命令自動抽取公鑰再生成req,在簽署過程中生成公鑰。證書申請填寫的是組織資訊。

#opensslreq-key-new-x509/etc/pki/CA/private/cakey.pem-out/etc/pki/CA/cacert.pem-days3650
Youareabouttobeaskedtoenterinformationthatwillbeincorporated
intoyourcertificaterequest.
WhatyouareabouttoenteriswhatiscalledaDistinguishedNameoraDN.
Therearequiteafewfieldsbutyoucanleavesomeblank
Forsomefieldstherewillbeadefaultvalue,
Ifyouenter'.',thefieldwillbeleftblank.
-----
CountryName(2lettercode)[XX]:CN
StateorProvinceName(fullname)[]:BeiJing
LocalityName(eg,city)[DefaultCity]:BeiJing
OrganizationName(eg,company)[DefaultCompanyLtd]:MagEdu#私建CA,那麼用於公司內部,就用公司名
OrganizationalUnitName(eg,section)[]:Ops
CommonName(eg,yournameoryourserver'shostname)[]:ca.magedu.com#要伺服器或主機名字
EmailAddress[]:[email protected]
#ls/etc/pki/CA/cacert.pem
/etc/pki/CA/cacert.pem
[[email protected]~]#ls/etc/pki/CA/cacert.pem-al
-rw-r--r--.1rootroot20654月702:06/etc/pki/CA/cacert.pem

-new:生成新證書籤署請求;

-x509:生成自籤格式證書,專用於建立私有CA時;不是自籤就不要加了,自動簽署證書;

-key:生成請求時用到的私有檔案路徑;

-out:生成的請求csr檔案路徑;如果自籤操作將直接生成簽署過的證書;

-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為例,前三步驟在請求主機上做,第四步在CA主機上做)

(1)用到證書的主機生成私鑰;

~]#mkdir /etc/httpd/ssl

~]#cd /etc/httpd/ssl

~]#(umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)#不要在CA配置目錄下建立,那是作為CA主機並自建CA才用到的路徑。

(2)生成證書籤署請求

~]#openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365 # 不要寫-x509

(3)將請求通過可靠方式傳送給CA主機;

(4)在CA主機上籤署證書;

~]#openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

~]#cat /etc/pki/CA/index.txt

#cat/etc/pki/CA/index.txt
V170105083250Z01unknown/C=CN/ST=Beijing/U=Magedu/OU=Ops/CN=www.magedu/[email protected]

主識標

/C=CN/ST=Beijing/U=Magedu/OU=Ops/CN=www.magedu/emailaddress[email protected]

檢視證書中的資訊:

~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject # 只顯示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 /etc/pki/CA/CA_NAME.crl

檢視crl檔案:

#openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

轉載於:https://blog.51cto.com/kingslanding/1764399