ssl協議及開源實現openssl
轉載地址:https://blog.csdn.net/jinbusi_blog/article/details/76039206?locationNum=4&fps=1
ssl協議
SSL: (Secure Socket Layer)安全套接層,ssl是一套安全協議,被應用層呼叫,當http呼叫ssl協議時被稱為https,當ftp呼叫ssl協議時被稱為sftp。
lls是一個協議的集合 ,其中包括:
Handshake協議:包括協商安全引數和密碼套件、伺服器身份認證(客戶端身份認證可選)、金鑰交換
ChangeCipherSpec協議:一條訊息表明握手協議已經完成;
Alert協議:對握手協議中一些異常的錯誤提醒,分為fatal和warning兩個級別,fatal型別錯誤會直接中斷SSL連結,而warning級別的錯誤SSL連結扔可繼續,只是會給出錯誤警告
Record協議:包括對訊息的分段、壓縮、訊息認證和完整性保護、加密等;
HTTPS協議:就是"HTTP協議"和"SSL/TLS協議"的組合。"HTTP over SSL"或"HTTP over TLS", 對http協議的文字資料進行加密處理後,成為二進位制形式傳輸。
ssl起源
Netscape:1994
v1.0,
1995 : sslv2.0
1996 : v3.0
IETF : 1999
tlsv1.0
2006 : tls v1.1 RFC4346
2008 : tls v1.2
2015 : tls v1.3
分層設計
- 最底層:基礎演算法原語的實現,aes,rsa,md5
- 向上一層,各種演算法的實現;
- 再向上一層 : 組合演算法實現的半成品;
- 用各種元件拼裝而成的各種成品密碼學協議軟體。
通訊流程
ssl通訊的兩個階段:
兩階段協議,分為握手階段和應用階段
握手階段(協商階段):客戶端和伺服器端認證對方身份(依賴於PKI體系,利用數字證書進行身份認證),並協商通訊中使用的安全引數、密碼套件以及主金鑰。後續通訊使用的所有金鑰都是通過MasterSecret生成。
應用階段: 在握手階段完成後進入,在應用階段通訊雙方使用握手階段協商好的金鑰進行安全通訊
https的通訊流程:
客戶端向服務端發起請求,服務端將自己的證書傳送給客戶端,
客戶端使用內置於系統中的ca的公鑰進行解密,解密成功即表示ca是合法的。
如果有需要客戶端將自己的證書傳送給客戶端
客戶端生成一個自己的對稱金鑰,使用服務端的公鑰進行加密,傳送給服務端。
服務端使用自己的私鑰解密收到的加密過的對稱金鑰,
雙方使用對稱金鑰進行通訊,(http協議呼叫ssl協議對自身的資料進行金鑰加密,被加密的http資料為二進位制)
ssl協議的開源實現:OpenSSL
ssl作為協議出現,協議是被具體定義的概念,openssl是ssl的具體的實現,openssl也是一套開源的軟體。
openssl包括三方面的元件:
1.openssl:多用途的命令列工具,包openssl
2.libcrypto: 加密演算法庫,包openssl-libs
3.libssl: 加密演算法實現模組庫,包nss
openssl工具使用
openssl支援互動式模式,指定引數。
互動式:
? :幫助
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
x509Message Digest commands (see the `dgst' command for more details)
man dgst 檢視此類命令的幫助
md2 md4 md5 rmd160
sha sha1Cipher commands (see the `enc' command for more details)
man enc 檢視此類命令的幫助
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 seed seed-cbc seed-cfb
seed-ecb seed-ofb zlib
非互動方式:
enc: (encrypt)加密或解密,用於對稱加密
-e : 加密
-d : 解密
-des3 : 指定加密演算法des3
-a
-salt : 加鹽
-in : 輸入的檔案
-out : 輸出的檔案
例子:
加密
# openssl enc -e -des3 -a -salt -in /etc/passwd -out ./haha.ssl
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
# ll /etc/passwd ./haha.ssl
-rw-r--r--. 1 root root 3329 7月 14 18:21 /etc/passwd
-rw-r--r-- 1 root root 4542 7月 16 17:02 ./haha.ssl
解密:
# openssl enc -d -des3 -a -salt -in ./haha.ssl -out ./haha.txt
enter des-ede3-cbc decryption password:
dgst用於單向加密,即生成雜湊值
-md5 : 指明演算法
例子:
# openssl dgst -md5 haha.txt
MD5(haha.txt)= 7d75659008a5a2f28cac1d2582d28491
passwd 生成密碼的雜湊值:
-1(數字1) : md5演算法
-salt 指定加的鹽
例:
[[email protected] ~]# openssl passwd -1
Password:
Verifying - Password:
$1$2otXR/.E$e2e0kTulm8LiSAKEgjKeD/
指定加鹽,但是加鹽之後只輸入了一次密碼
# openssl passwd -1 -salt asd
Password:
$1$asd$49QSDotWo6cyq5JpfBDQ4.
rand: 生成隨機數
格式openssl rand 編碼方式 位元組數。
-base64 使用base64編碼格式
-hex 使用hex編碼格式
# openssl rand -hex 2
380d
# openssl rand -base64 2
UR8=
genras 生成私鑰(僅生成私鑰,公鑰是從私鑰中提取出來的)
-out 生成的金鑰檔案
-des 使用對稱金鑰對生成的非對稱金鑰檔案機密(可選引數)
格式 openssl genras -out 檔案 -des 非對稱金鑰長度(多少位)
生成非對稱金鑰
openssl genras -out /root/haha.key
Generating RSA private key, 1024 bit long modules
..................................++++++
..................++++++
e is 65537 (0x10001)
指定使用對稱金鑰對生成的金鑰檔案加密
# openssl genras -out /root/haha-des.key -des 1024
Generating RSA private key, 1024 bit long modulus
......++++++
.++++++
e is 65537 (0x10001)
Enter pass phrase for /root/haha-des.key:
Verifying - Enter pass phrase for /root/haha-des.key:
使用umask決定檔案許可權
# (umask 066 ; openssl genrsa -out jinbus.key -des 2048)
Generating RSA private key, 2048 bit long modulus
.................................+++
...................+++
e is 65537 (0x10001)
Enter pass phrase for jinbus.key:
Verifying - Enter pass phrase for jinbus.key:
[[email protected] ~]# ll jinbus.key
-rw------- 1 root root 1738 7月 16 17:39 jinbus.key
ras顯示金鑰
-in 獲取公鑰的私鑰檔案
-pubout從私鑰中獲取公鑰
-out 儲存獲取的公鑰的檔案
例:
檢視檔案中的私鑰
# openssl ras -in jinbus.key
Enter pass phrase for jinbus.key:
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA3WuQa0EZ91BC2M9an99TqX5FJlBCqDSXuM/DS6RDzPuY6CwQ
l7nC11sMGxqC3ilXcfIKuCiKAX6uuAXI3Kskno5o8ftjyS1caiOdboTuUpqVaWFw
iGCygbNWKKrgV01b3FN/InrX46SGB4KlJ/soCl+kNa3MF4PiVowGKaVzepJJD8X6
hElaVIumQPKjSx7ZKiI/e89HnwxAGUTxtr6Oq3EcCSuXPKhz+FaAw9GsW0wKevyw
sUkGsEAWA2DZRyw3n5+rsVJn+BbIoURIW2cPiXhSnSl2xP57ThtogPtro2iv3O3C
7+9xczsahG3GbN+NwK4FGT+JZH5AJj18rk+6ywIDAQABAoIBADhUojQ3JsT9fVQt
RJABwAYR4sPBjYO/hY32BWhcDQe8RoVimIIRN1mUhzrp/rtIZz/M5R8+6QVCVm7o
wdYqEDHqZxaQ7y0CRk2Wa/nvBbasLzDVIkz/1MocduH3vwVW3/TopSJ/gCcg9xw4
B45pXiFtfZhOc+rTmaSNERBNUFixH0ryxFBqkuPb1bUaWumnOhMSIwgpkiCzy3on
v8/BuLHP3ySFb+94QvOsqInV2uYqXfLw7Tks2ETxmapvssWHzigrnvl5JyFb/UMH
rw5y4DCT+Ha9Brp22KuzBJx04UeCfAjVAlAiLUnjJH/IupNmCQhIsxW72IM+DdnJ
GkM4K3kCgYEA/uOVvFpwegQ/LAVKpNyOs+KYz17Oj/VXcrxjiCjFm213bH/Mnb+k
jhP/HNov2AGQTvNk+FwzjGIX+fMosNcb7+VegKA/opxWSJbw4tdaJK0SZmTFWJ33
JyXdKrsW8nA7cxKKaAwrKdnHBo9RXR3VomxsgmjvVVyt04FPJp1zLy8CgYEA3mKi
Jr7cbwYkcMKuBx9JkROTO3mAnPkicYuxH71FPPMB8mnPLQDEK/gne2Wcad57Olmv
hDgAhyEYHdgIay3FU3Fy0kWozXUha+U3MIq7BhuMH43AsjxgoGHbUzM8v6OKyDOY
HBbH9UzUW6WuLaP39q+xrq/mWQxN4cDA4xqyZyUCgYBWsewVM6G8LsOZ4nbgGlDD
aJhXOEUD/Avxb5hfEJcd5Z7QHavoH+4FkVGda60ISIfgArNeMmYqIpdLIeS+OXw8
HYUGNPtQAOLsL8LhNSRpAyEWCMKDAL+25g8S4K3OalQeMLk46KKpynQCjC69gE9Q
vpYtySlWnH5XSU01sioiawKBgQCENJzzbcn8Uul9A6+T2lzQ25NO6zezmkSIviQp
m0q7JjiFFbQtq+Pzw84tBMZNBg+6K7E1aFmf++Orck/m78n8hlhdez4UDss0qor5
16/BvMS7yXjCPTSwhBxwROibgS0zQcDvCfgL84XXihKXXYA/bkmycS3+yFrQl9fT
634d5QKBgBbPFkeAaGjzmLgIAfG1l/SIwjJhvH2n+xUt2YtV0VR9A07HKR/dda/9
L8vOlfegi3bODf+gwABOecbfKayzv6P+yQX6gBLaNvCXr1eE2Ob76Iwi2wb7UplL
3AU54zZlDFvH8YRl5fUVZGeJjyvGatViwuVDLvYCEz5tGos4rTyo
-----END RSA PRIVATE KEY-----
req請求
-new : 生成新證書籤署請求
-x509 : 專用於CA生成自簽證書
-key : 生成請求時用到的私鑰檔案
-days n : 證書的有效期限
-out /PATH/TO/SOMECERTFILE : 證書的儲存路徑
x509檢視證書中的資訊
格式: openssl x509 -in 檔名稱 -noout
-text|issuer|subject|serial|dates
openssl x509 -in 證書 -noout -text : 檢視證書
ca 生成ca證書
-days 證書有效期
-in 證書的申請檔案
-out 生成的證書