Openssl原理與實戰(zhàn)

SSL

SSL(Secure Sockets Layer,安全套接字層)是一種安全的加解密協(xié)議,它的實現(xiàn)也是需要程序(算法)來實現(xiàn)抖部。ssl是一種公共功能洞拨,但ssl本身只是一種規(guī)范和協(xié)議骤竹,需要程序員開發(fā)出一種遵循SSL協(xié)議規(guī)范的程序來實現(xiàn)。

分層設(shè)計:
1、最底層:基礎(chǔ)算法原語的實現(xiàn),aes, rsa, md5
2潜沦、向上一層:各種算法的實現(xiàn);
3绪氛、再向上一層:組合算法實現(xiàn)的半成品唆鸡;
4、用各種組件拼裝而成的各種成品密碼學協(xié)議軟件枣察;

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)

SSL會話主要三步:

①客戶端向服務器端索要并驗正證書争占;
②雙方協(xié)商生成“會話密鑰”;
③雙方采用“會話密鑰”進行加密通信询件;

SSL Handshake Protocol:

第一階段:ClientHello
支持的協(xié)議版本燃乍,比如tls 1.2;
客戶端生成一個隨機數(shù)宛琅,稍后用戶生成“會話密鑰”
支持的加密算法,比如AES逗旁、3DES嘿辟、RSA;
支持的壓縮算法片效;

第二階段:ServerHello
確認使用的加密通信協(xié)議版本红伦,比如tls 1.2;
服務器端生成一個隨機數(shù)淀衣,稍后用于生成“會話密鑰”
確認使用的加密方法昙读;
服務器證書;

第三階段
驗正服務器證書膨桥,在確認無誤后取出其公鑰蛮浑;(發(fā)證機構(gòu)、證書完整性只嚣、證書持有者沮稚、證書有效期、吊銷列表)
發(fā)送以下信息給服務器端:
編碼變更通知册舞,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送蕴掏;
客戶端握手結(jié)束通知;

第四階段
收到客戶端發(fā)來的第三個隨機數(shù)pre-master-key后,計算生成本次會話所有到的“會話密鑰”盛杰;
向客戶端發(fā)送如下信息:
編碼變更通知挽荡,表示隨后的信息都將用雙方商定的加密方法和密鑰發(fā)送;
服務端握手結(jié)束通知即供;

SSL應用(參考示例)

以https通信過程為例描述SSL的實現(xiàn)過程:

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer)徐伐,是以安全為目標的HTTP通道,簡單講是HTTP的安全版募狂。即HTTP下加入SSL層办素,HTTPS的安全基礎(chǔ)是SSL。

以https為例祸穷,進一步說明如何依靠CA來可靠的獲得通信對方的公鑰性穿,如圖:


https的主要實現(xiàn)過程說明:

(1)在通信之前,服務器端通過加密算法生成一對密鑰雷滚,并把其公鑰發(fā)給CA申請數(shù)字證書需曾,CA審核后,結(jié)合服務端發(fā)來的相關(guān)信息生成數(shù)字證書祈远,并把該數(shù)字證書發(fā)回給服務器端呆万。
(2)客戶端和服務器端經(jīng)tcp三次握手,建立初步連接车份。
(3)客戶端發(fā)送http報文請求并協(xié)商使用哪種加密算法谋减。
(4)服務端響應報文并把自身的數(shù)字簽名發(fā)給服務端。
(5)客服端下載CA的公鑰扫沼,驗證其數(shù)字證書的擁有者是否是服務器端(這個過程可以得到服務器端的公鑰)出爹。(一般是客戶端驗證服務端的身份,服務端不用驗證客戶端的身份缎除。)
(6)如果驗證通過严就,客戶端生成一個隨機對稱密鑰,用該密鑰加密要發(fā)送的URL鏈接申請器罐,再用服務器端的公鑰加密該密鑰梢为,把加密的密鑰和加密的URL鏈接一起發(fā)送到服務器。
(7)服務器端使用自身的私鑰解密轰坊,獲得一個對稱密鑰铸董,再用該對稱密鑰解密經(jīng)加密的URL鏈接,獲得URL鏈接申請衰倦。
(8)服務器端根據(jù)獲得的URL鏈接取得該鏈接的網(wǎng)頁袒炉,并用客戶端發(fā)來的對稱密鑰把該網(wǎng)頁加密后發(fā)給客戶端。
(9)客戶端收到加密的網(wǎng)頁樊零,用自身的對稱密鑰解密我磁,就能獲得網(wǎng)頁的內(nèi)容了孽文。
(10)TCP四次揮手,通信結(jié)束夺艰。

OpenSSL

組件:

libcrypto, libssl主要由開發(fā)者使用
openssl:多用途命令行工具

openssl:

從多子命令芋哭,分為三類:

  • 標準命令
  • 消息摘要命令(dgst子命令)
  • 加密命令(enc子命令)
[root@promote ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
[root@promote ~]# openssl ?
openssl:Error: '?' is an invalid command.

Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              

Message Digest commands (see the `dgst' command for more details)
md2               md4               md5               rmd160            
sha               sha1              

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            rc5               rc5-cbc           rc5-cfb           
rc5-ecb           rc5-ofb           seed              seed-cbc          
seed-cfb          seed-ecb          seed-ofb          zlib   
對稱加密:

工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, towfish

enc命令:
加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext

[root@promote ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@promote ~]# cat fstab.ciphertext
U2FsdGVkX19XpMD+Z0r8qS41Ov8IqY7LHDtswe7qy7amEb6sxIzXr/K6HW0w2qWq
rzNUUZGemEjdiYikaLQePfxVgreuqcOAVmrn+VNDt+gYdTw+cCK3v9jSLBxuJOXc
Hb2deMJdk+j0umCRnS+Db/cy5M1Kj4eXckRu4Yjft0oZkoRG8u5CIj81rL4qwMXB
2AAOsDl8ZPakVDh7TyYvqWndpH2gFTdYcw1NyOOFqCgUV5bE11LSOSA0U69CCFqa
ijSHky/uujwP2M08pFQAogUN6KfLjvqq5frFhR6nWHT1k7UHwYnWSNPTTDLw0nQf
Vo/QiyTqVZ+tdBqdd08lKcavDImGOrGkhyqDi9f4UaAzXkL22YW1WUhFZ8mstsjd
PbEp6vkzgKz2k90pbf3p9JUxYbIKHgcjrBfclDQmaMPQTCw4rDy1gm6tfXPhad3g
Nin8p78lNR43VfHYbf0HpMCZClh8ZPCNgIbO/CGnJNJOf7uozK3/fhCntg8oVvVK
q9y6SXySYrM/wC6kbF13u22mOB4NRGCwHITDPLvTOOJ78JEd0HWPgwkfqGgMvMSp
BiRg6MounfixNZLECwGLyRoT+S7To4oiDzpvs+JV9xWaVnEB8yaS0Swmi6YxVmI6
REHhw2WrCV3X7HQLCXOMuGXkNMh24w2TRNTYidC7SaPmIK7V5DVhkBKM4M/IlKq1
uTtJaU/DXUCUF34eYlGVsmw9QpUD5/SxUjcWpX8woljthwIvUy7kHvPctp0lwBZP
miKiCYlpG00=

解密:openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext

[root@promote ~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
enter des-ede3-cbc decryption password:
[root@promote ~]# cat fstab

#
# /etc/fstab
# Created by anaconda on Sun Apr 14 09:29:51 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos_promote-root /                       xfs     defaults        0 0
UUID=273deb66-d03c-457f-8b29-5df019b3e53a /boot                   xfs     defaults        0 0
/dev/mapper/centos_promote-home /home                   xfs     defaults        0 0
/dev/mapper/centos_promote-swap swap                    swap    defaults        0 0
單向加密:

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

dgst命令:
openssl dgst -md5 /PATH/TO/SOMEFILE

[root@promote ~]# md5sum fstab
c58fef6dca558db2e6122bdf12f66aba  fstab
[root@promote ~]# openssl dgst -md5 fstab
MD5(fstab)= c58fef6dca558db2e6122bdf12f66aba

生成用戶密碼:
工具:passwd, openssl passwd
openssl passwd -1 -salt SALT

[root@promote ~]# openssl passwd -1 -salt 12345678
Password: 
$1$12345678$2MUF23c1xwXhNSpW3dupd.

生成隨機數(shù):
工具:openssl rand
openssl rand -hex NUM
openssl rand -base NUM

[root@promote ~]# openssl rand -base64 12
0iMFITFdgsHDsKLA
[root@promote ~]# openssl rand -hex 12
6e02d827b1944dfe66e18b93
公鑰加密:

加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg

數(shù)字簽名:
算法:RSA郁副, DSA减牺, ELGamal
工具:openssl rsautl, gpg

密鑰交換:

算法:DH

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

[root@promote ~]# (umask 077;openssl genrsa -out /tmp/mykey3.private 2048)
Generating RSA private key, 2048 bit long modulus
...............................................................................................................................................+++
........................................................................................................................................+++
e is 65537 (0x10001)

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

[root@promote ~]# openssl rsa -in /tmp/mykey3.private -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAslrkVrMPj7efIJ1Pt337
sVVguLyu1xdU4BpYZJEEXncik0+UtlzQ6yR2tpys0LxDac2urL4dLhk5S/khU71j
zm4w3yZPolxMP0hAORisx4QmVN+QRfayWSCnR2RUI73Xn8hnY7fPGN7kZD5ZlMnd
H0aUiuSMugQQR5ZqJmzmHUqcsfT/flAQDAhSChFlseTJ4y93uHR8zGou4cR3mluL
gGSXAtokj5+9m4Q0pMQuuu+qaZyfJu+3iv1OgXNi5BOFwhIZdrZv64W+nx0C9sUb
HjpFliMss0tCAebxM6fwjaxqv+8Is156THXfSvIVDcqkSU0Uckx3OKUcWFK8SVyD
6wIDAQAB
-----END PUBLIC KEY-----

Linux系統(tǒng)上的隨機數(shù)生成器:

/dev/random:僅從熵池返回隨機數(shù);隨機數(shù)用盡存谎,則阻塞拔疚;

/dev/urandom:從熵池返回隨機數(shù);隨機數(shù)用盡既荚,會利用軟件生成偽隨機數(shù)稚失,非阻塞;偽隨機數(shù)不安全恰聘;

熵池中隨機數(shù)的來源:

硬盤IO中斷時間間隔句各;
鍵盤IO中斷時間間隔;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晴叨,一起剝皮案震驚了整個濱河市凿宾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兼蕊,老刑警劉巖初厚,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遍略,居然都是意外死亡惧所,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門绪杏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纽绍,你說我怎么就攤上這事蕾久。” “怎么了拌夏?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵僧著,是天一觀的道長。 經(jīng)常有香客問我障簿,道長盹愚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任站故,我火速辦了婚禮皆怕,結(jié)果婚禮上毅舆,老公的妹妹穿的比我還像新娘。我一直安慰自己愈腾,他們只是感情好憋活,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虱黄,像睡著了一般悦即。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橱乱,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天辜梳,我揣著相機與錄音,去河邊找鬼泳叠。 笑死作瞄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的析二。 我是一名探鬼主播粉洼,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叶摄!你這毒婦竟也來了属韧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛤吓,失蹤者是張志新(化名)和其女友劉穎宵喂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體会傲,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡锅棕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淌山。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裸燎。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泼疑,靈堂內(nèi)的尸體忽然破棺而出德绿,到底是詐尸還是另有隱情,我是刑警寧澤退渗,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布移稳,位于F島的核電站,受9級特大地震影響会油,放射性物質(zhì)發(fā)生泄漏个粱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一翻翩、第九天 我趴在偏房一處隱蔽的房頂上張望都许。 院中可真熱鬧稻薇,春花似錦、人聲如沸梭稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弧烤。三九已至忱屑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暇昂,已是汗流浹背莺戒。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留急波,地道東北人从铲。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像澄暮,于是被迫代替她去往敵國和親名段。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 早期互聯(lián)網(wǎng)數(shù)據(jù)傳輸是基于TCP/IP模型完成數(shù)據(jù)交換泣懊,其各層對傳輸?shù)臄?shù)據(jù)包進行各協(xié)議的封裝伸辟,從數(shù)據(jù)的發(fā)送方到...
    魏鎮(zhèn)坪閱讀 6,585評論 1 11
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,104評論 1 32
  • SSL(Secure Socket Layer信夫,安全套接字層)是為網(wǎng)絡(luò)通信提供安全保障和數(shù)據(jù)完整性的一種安全協(xié)議,...
    CHUANHAI閱讀 1,894評論 0 7
  • 1 概述 OpenSSL 是一個安全套接字層密碼庫卡啰,囊括主要的密碼算法静稻、常用的密鑰和證書封裝管理功能及SSL協(xié)議,...
    ghbsunny閱讀 3,271評論 0 3
  • SSL是一種國際標準的加密及身份認證通信協(xié)議匈辱,您用的瀏覽器就支持此協(xié)議振湾。SSL(Secure Sockets La...
    星空星晴閱讀 5,708評論 1 1