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中斷時間間隔;