1. 程式人生 > >ssl協議及開源實現openssl

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

分層設計

  1. 最底層:基礎演算法原語的實現,aes,rsa,md5
  2. 向上一層,各種演算法的實現;
  3. 再向上一層 : 組合演算法實現的半成品;
  4. 用各種元件拼裝而成的各種成品密碼學協議軟體。

通訊流程

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           
x509              

Message Digest commands (see the `dgst' command for more details)
man dgst 檢視此類命令的幫助
md2               md4               md5               rmd160            
sha               sha1              

Cipher 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 生成的證書