OpenSSL

OpenSSL

 

openssl命令:

 查看幫助:給一個錯誤的命令就可以查看所有命令幫助

查看軟件版本:openssl version

 標準命令: enc, ca, req, genrsa, ...

 

對稱加密

工具:openssl  enc,  gpg

支持的算法:3des, aes, blowfish, towfish

 

enc對稱加密命令:

加密:~]# openssl  enc  -e  -des3  -a  -salt  -in fstab   -out fstab.ciphertext

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

-a表示64位文本文件,默認二進制文件,

 

單向加密

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

 

dgst命令:

~]# openssl  dgst  -md5  /PATH/TO/SOMEFILE

[root@yph7s ~]# md5sum fstab

12f17f09df2c25649fd28a59e49955da  fstab

 

生成用戶密碼

工具:passwd, openssl  passwd

 

[root@yph7s ~]# whatis passwd

sslpasswd (1ssl)     - compute password hashes

[root@yph7s ~]# man sslpasswd

 

openssl  passwd  -1  -salt  SALT  ---“-1”指md5

[root@yph7s ~]# openssl passwd -1 -salt 123456

Password: 

$1$123456$QMBx42LRqK1ZWPfItmpYG0

 

生成隨機數

工具:openssl  rand

[root@yph7s ~]# whatis rand

[root@yph7s ~]# man sslrand

 

~]# openssl  rand  -hex  NUM ---16進制數字

[root@yph7s ~]# openssl rand -hex 10 -----10表示生出10位,

7347b0074352d7643192

 

~]# openssl  rand  -base64  NUM ---64爲文本格式

[root@yph7s ~]# openssl rand -base64 10

xSIyOAD+K84dvQ==  最後的==屬於標準輸出,使用隨機數時要去掉

 

公鑰加密

 

生成私鑰

[root@yph7s ~]# openssl genrsa 1024 >> private   1024位長度,必須是2^n位數

 

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

使用括號括起來的命令表示在子shell中執行,先設置umask,然後執行,完後退出子shell,對當前shell無影響

[root@yph7s ~]# (umask 077; openssl genrsa -out private2 2048)

umask 077是爲了給私鑰文件設置權限

 

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

[root@yph7s ~]# openssl rsa -in ./private -pubout -out ./public.key

 

 

Linux系統上的隨機數生成器:

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

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

僞隨機數不安全;

 

熵池中隨機數的來源:

硬盤IO中斷時間間隔;

鍵盤IO中斷時間間隔;敲鍵盤,複製數據

 

 

CA

 

openssl配置文件:/etc/pki/tls/openssl.cnf

 

構建私有CA---以httpd爲例:

CA服務機:cakey.pem私鑰、cacert.pem自簽證書、httpd.crt最終證書

客戶機:httpd.key 客戶機私鑰、httpd.csr簽署請求、httpd.crt最終證書

 

在確定配置爲CA的服務上生成一個自簽證書,併爲CA提供所需要的目錄及文件即可;

CA主機

(1) 生成私鑰;

[root@yph7s ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

名字必須爲cakey.pem

 

(2) 生成自簽證書;

[root@yph7s ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655  ---只有作爲CA主機時纔會在此目錄下創建

 

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

-x509:專用於創建私有CA時,生成自籤格式證書;

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

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

-days:證書的有效時長,單位是day;

 

Country Name (2 letter code) [XX]:CN  -----國家的名字

State or Province Name (full name) []:BeiJing  ------省份名字

Locality Name (eg, city) [Default City]:BeiJing  -----城市名字

Organization Name (eg, company) [Default Company Ltd]:Alibaba  ----公司名字

Organizational Unit Name (eg, section) []:ops  --------部門名字

Common Name (eg, your name or your server's hostname) []:a.com  ----主機名

Email Address []:[email protected] -----管理員郵件地址

 

(3) 爲CA提供所需的目錄及文件;CA服務器

[root@yph7s ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}

[root@yph7s ~]# touch  /etc/pki/CA/{serial,index.txt}

[root@yph7s ~]# echo  01 > /etc/pki/CA/serial -----序列號

 

等把CA客戶的請求拷過來後

[root@yph7s ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365--爲申請授權簽證

[root@yph7s ~]# cat /etc/pki/CA/index.txt

V170116191737Z01unknown/C=CN/ST=BeiJing/O=Alibaba/OU=p\x08ops/CN=www.magedu.com/emailAddress=webadmin @magedu.com

 

[root@yph7s ~]# scp /etc/pki/CA/certs/httpd.crt [email protected]:/etc/httpd/ssl/ ---將證書發給請求者

然後把httpd.csr刪掉,避免泄露

 

服務機都可以看證書信息

[root@yph7s ~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject

serial=01

subject= /C=cn/ST=beijing/O=alibaba/OU=sho/CN=www.magedu.com/[email protected]

 

 

 

CA客戶機

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

[root@localhost ~]# mkdir  /etc/httpd/ssl

[root@localhost ~]# cd  /etc/httpd/ssl

 

生成私鑰:

[root@localhost ssl]# (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)

 

(2) 生成證書籤署請求

[root@localhost ssl]# openssl  req  -new  -key  /etc/httpd/ssl/httpd.key  -out /etc/httpd/ssl/httpd.csr  -days  365

Locality Name (eg, city) [Default City]:BeiJing -----一定要與主機CA在同一域,同一單位,應該是公司保持一致

Organization Name (eg, company) [Default Company Ltd]:Alibaba  ----公司名字,

Common Name (eg, your name or your server's hostname) []:www.magedu.com ----一定與客戶端訪問的名字一致

 

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

[root@localhost ssl]# scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/

一般是不能通過網絡發送的,應該是CA派人拷貝走

 

客戶機查看證書中的信息:

[root@localhost ssl]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject

serial=01

subject= /C=cn/ST=beijing/O=alibaba/OU=sho/CN=www.magedu.com/[email protected]

 

 

 

 

CA吊銷證書:一般會自動吊銷,不用我們手動吊銷,只需瞭解就行。openca是常用吊銷命令,不是這個,

步驟:

(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/##.pem ---證書序列號

 

(3) 生成吊銷證書的吊銷編號(第一次吊銷證書時執行) ---服務器第一次吊銷時,再吊銷第二個人就不了

# echo  01  > /etc/pki/CA/crlnumber

 

(4) 更新證書吊銷列表

# openssl  ca  -gencrl  -out  thisca.crl

 

查看crl文件:

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

 

 

 

 

 

 

 

 

加密類型:

 

對稱加密:加密和解密使用同一個密鑰;

 

公鑰加密:密鑰分爲公鑰與私鑰

公鑰:從私鑰中提取產生;可公開給所有人;pubkey

私鑰:通過工具創建,使用者自己留存,必須保證其私密性;secret key;

特點:用公鑰加密的數據,只能使用與之配對兒的私鑰解密;反之亦然;

 

用途:

數字簽名:發送方用私鑰加密數據數據特徵碼的結果。主要在於讓接收方確認發送方的身份;確認來源合法性

密鑰交換:發送方用對方公鑰加密一個對稱密鑰,併發送給對方;

數據加密:安全性很低,一般不用

 

 

 

單向加密:即提出數據指紋;只能加密,不能解密;

特性:定長輸出、雪崩效應;

功能:完整性驗證;

算法:

md5:Message Digest 5, 128bits

sha1:Secure Hash Algorithm 1, 160bits 安全的哈希算法

sha224, sha256, sha384, sha512

 

密鑰交換: IKE(Internet Key Exchange)互聯網祕鑰交換

公鑰加密

密碼本身不用在互聯網傳輸,所有比較安全

DH(Deffie-Hellman)地獄男爵

A:p, g --用生成器生成非常大的質數,這兩個是公開的

B:p, g

 

A:生成 x ---只有自己知道

然後計算S1= p^x%g

把S1給B

 

B:生成 y----y只有B知道

計算-S2=p^y%g

把S2給A

 

A再計算:S3 =S2^x

B再計算: S4=S1^y

 

(p^y%g)^x=(p^x%g)^y 即S3=S4,S3和S4就是二人的祕鑰

 

外人只最多竊取p,g,S1和S2,但計算不出x和y,因爲數太大非常困難,在數學界都是難題

 

 

 

加密具體流程

Alice:

(1)Alice用單向加密MD5等計算出數據特徵碼

(2)然後用自己的祕鑰加密特徵碼,生成數字簽名

(3)把數字簽名附加到數據後面----------確保完整性和來源合法性。

(4)Alice用一次性祕鑰結合對稱加密算法加密數據和數字簽名,生成一個對稱加密的解密密鑰

(5)再拿jack的的公鑰加密這個對稱加密的解密密鑰

 

jack:

(6)jack拿自己的私鑰解密,從而拿到對稱加密的解密密鑰

(7)jack拿對稱加密的解密密鑰,進行解密操作後,就得到了數據和數字簽名

(8)拿Alice公鑰配對,驗證來源合法性

(9)用相同的單向加密計算數據的特徵碼,與配對數字簽名後得到的特徵碼是否一致,從而驗證數據完整性。

 

但是Alice和jack如何拿到對方的公鑰,網上直接傳輸很危險,如果公鑰被劫持,悄悄替換成間諜的公鑰了呢

CA是個大家都認可的平臺,大家都信任CA,通過CA傳輸公鑰

 

如何知道你拿到的CA證書不是假的呢,CA一般都是當面交易的,不會被劫持。正版windows系統內置的有CA證書,盜版就不一定了。

用CA的公鑰解密CA證書,再用定向加密計算並比較證書特徵碼。看證書的有限期,看主題名稱是否一致,看證書是否被吊銷

CA證書是自己給自己發的,

 

 

 

 

 

PKI:Public Key Infrastructure公鑰基礎設施:

 

簽證機構:CA   ---商水縣公安局,但使用範圍是全國

註冊機構:RA   ---袁老鄉派出所

證書吊銷列表:CRL   ----公鑰丟失,申請吊銷

證書存取庫:

 

X.509v3:定義了證書的結構以及認證協議標準

版本號  -----身份證二代

序列號   ----隱藏

簽名算法ID

發行者名稱

有效期限

主體名稱  --姓名

主體公鑰

發行者的惟一標識 ----商水縣公安局的id

主體的惟一標識   ----身份證號

擴展

發行者的簽名

 

 

SSL會話主要三步

1、客戶端向服務器端索要並驗正證書(公鑰);(支付寶,網銀等服務器也會向客戶端索要證書)

2、雙方協商生成“會話密鑰”;---對稱加密和解密用同一個祕鑰

3、雙方採用“會話密鑰”進行加密通信;

 

SSL 握手四步走

第一階段:客戶端ClientHello:發出加密通信請求

客戶端發送自己支持的協議版本,比如tls 1.2;

客戶端生成一個隨機數,稍後用戶生成“一次性會話密鑰”

客戶端發送自己支持的加密算法,比如AES、3DES、RSA;

客戶端發送自己支持的壓縮算法;

 

第二階段:服務器端ServerHello,服務器的迴應

服務器確認雙方都支持的加密通信協議版本,比如tls 1.2;如果協議版本不同就拒接服務

服務器端生成一個隨機數,稍後用於生成“一次性會話密鑰”

服務器確認雙方都支持的加密方法;

服務器發送自己的證書;

(服務器所有客戶端證書,一般網站不會驗證)

 

第三階段:客戶端

驗正服務器證書,在確認無誤後取出其公鑰;(發證機構、證書完整性、證書持有者(必須與域名一致)、證書有效期、吊銷列表)

發送以下信息給服務器端:

一個隨機數(第二個);用於服務器公鑰解密

編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;

客戶端握手結束通知;

 

第四階段:服務器端

收到客戶端第二次發來的隨機數pre-master-key後,計算生成本次會話所有到的“會話密鑰”;

向客戶端發送如下信息:

編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;

服務端握手結束通知;

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章