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後,計算生成本次會話所有到的“會話密鑰”;
向客戶端發送如下信息:
編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;
服務端握手結束通知;