OpenSSL基礎
·傳輸層協議:TCP,UDP,SCTP
port:進程地址,進程向內核注冊使用某端口(獨占)
·同一主機上的進程間通信:IPC,message queue,shm,semerphor
·不同主機上的進程間通信:socket
cip:port <– –> sip:port
cip:55637 <– –> sip:80
監聽模式:LISTEN(ip:port)
·加密需要:
不加密流量的易受攻擊性:
密碼/數據嗅探
數據操作
驗證操作
相當于郵寄明信片
不安全的傳統協議:
telnet 、FTP 、POP3 等等;不安全密碼
http 、smtp 、NFS 等等;不安全信息
Ldap 、NIS 、rsh
·設計基本原則:
使用成熟的安全系統
以小人之心度輸入數據
外部系統是不安全的
最小授權
減少外部接口
缺省使用安全模式
安全不是似是而非
從STRIDE 思考
在入口處檢查
·SSL:Secure Sockets Layer
http –> ssl –> https
·安全的目標:
保密性:confidentiality
完整性:integrity
可用性:availability
·攻擊類型:
威脅保密性的攻擊:竊聽、通信量分析
威脅完整性的攻擊:更改、偽裝、重放、否認
威脅可用性的攻擊:拒絕服務(Dos)
·解決方案:
技術(加密和解密)、服務(用于抵御攻擊的服務,為了上述安全目標而特地設計的安全服務)
加密和解密:
傳統加密方法:替代加密方法、置換加密方法
現代加密方法:現代塊加密方法
服務:
認證機制
訪問控制機制
密鑰算法和協議:
對稱加密
公鑰加密
單項加密
認證協議
Linux系統:OpenSSL(ssl),GPG(pgp)
·OpenSSL由3部分組成:
libcrypto庫:加密解密的庫
libssl庫:加密模塊應用庫,實現ssl及tls
openssl:多用途命令行工具
加密算法和協議:
·對稱加密:加密和解密使用同一密鑰
DES:Data Encryption Standard
3DES:Triple DES
AES:Advanced Encryption Standard (128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
1、加密、解密使用同一個密鑰
2、將原始數據分割成為固定大小的塊、逐個進行加密
缺陷:
1、密鑰過多
2、密鑰分發困難
3、數據來源無法確認
·公鑰加密:密鑰分為公鑰和私鑰
公鑰:從私鑰中提取產生;可公開給所有人;public key
私鑰:通過工具創建,使用者自己存留,必須保證其私密性;secret key
特點:用公鑰加密的數據,只能使用與之配對的私鑰解密,反之亦然
用途:
數字簽名:主要在于讓接收方確認發送方的身份
密鑰交換:發送方用對方公鑰加密一個對稱密鑰,并發送給對方
數據加密
算法:RSA、DSA、ELGamal
DSS:Digital Signature Standard
DSA:Digital signature Algorithm
DSA:只能簽名不能加密
缺點:密鑰長,加密解密效率低下
實現加密:
接收者
生成公鑰/密鑰對:P和S
公開公鑰P,保密密鑰S
發送者
使用接收者的公鑰來加密消息M
將P(M)發送給接收者
接收者
使用密鑰S來解密:M=S(P(M))
實現數字簽名:
發送者
生成公鑰/密鑰對:P和S
公開公鑰P,保密密鑰S
使用密鑰S來加密消息M
發送給接收者S(M)
接收者
使用發送者的公鑰來解密M=P(S(M))
結合簽名和加密
·單向加密:即提出數據指紋(特征碼);只能加密,不能解密
特征:定長輸出、雪崩效應
功能:實現完整性
算法:
md5:Message Digest 5 ,128bits
sha1:Secure Hash Algorithm 1 ,160bits
sha224 ,sha256 ,sha384 ,sha512
工具
md5sum | sha1sum [ –check ] file
openssl 、gpg
rpm -V
md5sum /path/to/file
對文件進行哈希計算
例如:
md5sum f1 > f1.md5
md5sum –check f1.md5
比較文件的hash值是否變化
·密鑰交換:IKE(Internet Key Exchange)
公鑰加密
DH(Deffie-Hellman)<迪菲-赫爾曼>
ECDH(橢圓曲線DH)
ECDHE(臨時橢圓曲線DH)
A:p,g 協商生成公開的整數a,素數p
B:p,g
A:產生一個隨機數x
通過DH算法發送給B一個數據
–> p^x%g ==> B
密鑰:A:(p^y%g)^x=p^yx%g
B:產生一個隨機數y
通過DH算法發送給A一個數據
–> p^y%g ==>A
密鑰:B:(p^x%g)^y=p^xy%g
DH:
1、 A:a,p 協商生成公開的整數a, 大素數p
B:a,p
2、 A:生成隱私據數據:x(x<p),計算得出a^x%p,發送給B
B:生成隱私據數據:y(y<p), 計算得出a^y%p,發送給A
3、 A:計算得出(a^y%p)^x=a^xy%p,生成為密鑰
B:計算得出(a^x%p)^y=a^xy%p,生成為密鑰
·數據傳輸方式:
加密通信中數據塊的結構:key<對稱加密>(data+SA[hash(data)])+PB(key)
用hash算法:計算出data的特征碼
用自己的SA<私鑰>:簽名data的特征碼
用對稱加密<key>加密:data和簽名后的hash(data)
用對方的PB<公鑰>加密:對稱加密的密鑰<key>
把對稱加密的數據和PB加密的數據一同發給對方
·PKI:Public Key Infrastructure
公鑰基礎設施:
簽證機構:CA
注冊機構:RA
證書吊銷列表:CRL
證書存取庫:
X.509v3:定義了證書的結構以及認證協議標準
版本號
序列號
簽名算法ID
發行者名稱
有效期限
主體名稱
主體公鑰
發行者的唯一標識
主體的唯一標識
擴展
發行者的簽名
證書獲?。?/span>
證書類型:
證書授權機構的證書
服務器
用戶證書
獲取證書兩種方法:
使用證書授權機構
生成簽名請求(csr)
將csr發送給CA
從CA處接收簽名
自簽名的證書
自已簽發自己
·SSL:Secure Sockets Layer
Netscape:1994
V1.0(沒有面世),V2.0,V3.0
·TLS:Transport Layer Security
IETF:1999
V1.0,V1.1,V1.2,V1.3
分層設計:
1、最底層:基礎算法原語的實現:aes、rsa、md5
2、向上一層:各種算法的實現
3、再向上一層:組合算法實現的半成品
4、最上層:用各種組件拼裝而成的各種成品密碼學協議軟件
協議的開源實現:OpenSSL
SSL/TLS
·SSL:安全套接字層(ssl 1.0,2.0,3.0)
·TLS:傳輸層安全(tls 1.0,1.1,1.2,1.3)
·OpenSSL
libcrypto
libssl
openssl
·SSL回話主要三步:
客戶端向服務器端索要并驗證證書
雙方協商生成“會話密鑰”
雙方采用“會話密鑰”進行加密通信
·SSL Handshake Protocol
第一階段:ClientHello
支持的協議版本:比如tls 1.2
客戶端生成一個隨機數,稍后用于生成“會話密鑰”
支持的加密算法:比如AES、RSA
支持的壓縮算法
第二階段:ServerHello
確認使用的加密通信協議版本:比如tls 1.2
服務器端生成一個隨機數,稍后用于生成“會話密鑰”
確認使用的加密方法
服務器證書
第三階段:
驗證服務器證書,在確認無誤后取出其公鑰(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表)
發送以下信息給服務器端
一個隨機數
編碼變更通知,表示隨后額信息都將用雙方商定的加密方法和密鑰發送
客戶端握手結束通知
第四階段:
收到客戶端發來的第三個隨機數<客戶端在第三階段產生的隨機數>per-master-key后,計算生成本次會話所用到的“會話密鑰”
向客戶端發送如下信息:
編碼變更通知,表示隨后額信息都將用雙方商定的加密方法和密鑰發送
服務器端握手結束通知
·PKI:公鑰基礎設施
簽證機構:CA
注冊機構:RA
證書吊銷列表:CRL
證書存取庫
OpenSSL命令
·組件:
libcrypto,libssl主要由開發者使用
openssl:多用途命令行工具
·openssl:
眾多子命令,可分為三類:
標準命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
標準命令:enc ,ca ,req ,genrsa,…..
openssl ?
查看openssl命令的眾多子命令
·對稱加密:
工具: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 -in fstab.ciphertext -out fstab.test
-e:加密
-d:解密
-a:[-a/-base64]使用base64位的輸出格式
-salt:加點鹽ftp://10.1.0.1/pub/exam/%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%90%9C%E7%8B%90/QQ%E5%9B%BE%E7%89%8720141202142644.jpg
-in:對那個文件進行加密/解密
-out:加密/解密輸出的文件路徑及文件名
·單向加密:
工具:openssl dgst ,md5sum ,sha1sum ,sha224sum ……
dgst命令:
# openssl dgst -md5 /PATH/TO/SOMEFILE
·生成用戶密碼:
工具:passwd ,openssl passwd
openssl passwd -1 -salt SALT
-1:使用sha1的密鑰長度生成密碼
默認只支持sha1,不支持sha256以及sha512
·生成隨機數:
工具:openssl rand
# openssl rand -hex NUM
hex encode output
生成16位進制的隨機數,1位占4字節
# openssl rand -base64 NUM
base64 encode output
生成的隨機數要去掉最后面的2個=符號
·公鑰加密:
加密解密:
算法:RSA ,ELGamal
工具:openssl rsautl ,gpg
數字簽名:
算法:RSA ,DSA ,ELGamal
工具:openssl rsautl ,gpg
密鑰交換:
算法:DH
生成密鑰:
生成私鑰:# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
可以加 -des3 使用3des對私鑰進行加密
提出公鑰:# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
Linux系統上的隨機數生成器:
/dev/random:僅從熵池返回隨機數;隨機數用盡,阻塞
/dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟件生成偽隨機數,非阻塞
偽隨機數不安全
熵池中隨機數的來源:
硬盤IO中斷時間間隔
鍵盤IO中斷時間間隔
隨機數不夠用時:
1、擊鍵<不建議>
2、cp或mv一個大的文件,從而產生大量硬盤IO終端<建議>
CA:
·公共信任的CA,私有CA
·建立私有CA:
openssl
OpenCA
·openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
[ CA_default ] dir = /etc/pki/CA # Where everything is kept //CA目錄 certs = $dir/certs # Where the issued certs are kept //CA簽名的證書所放路徑 crl_dir = $dir/crl # Where the issued crl are kept //吊銷列表 database = $dir/index.txt # database index file. <必須touch出文件來> //已簽名證書的數據庫文件 new_certs_dir = $dir/newcerts # default place for new certs. //新證書存放路徑 certificate = $dir/cacert.pem # The CA certificate //CA自己的證書路徑及文件名 serial = $dir/serial # The current serial number <必須touch出文件來> //每個證書的序列號及文件名 crlnumber = $dir/crlnumber # the current crl number //吊銷證書的序列號及文件名 # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key <很重要> //CA自己的私鑰路徑及文件名 default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha256 # use SHA-256 by default preserve = no # keep passed DN ordering # For the CA policy [ policy_match ] countryName = match //match必須同CA服務器 stateOrProvinceName = match organizationName = match organizationalUnitName = optional //optional可以選的 commonName = supplied //supplied自己給出 emailAddress = optional
·構建私有CA:
在確定配置為CA的服務器上生成一個自簽證書,并為CA提供所需要的目錄及文件即可
步驟:
(1)生成私鑰
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096
(2)生成自簽證書
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新證書簽署要求
-x509:生成自簽格式證書,專用于創建私有CA時
-key:生成請求時用到的私有文件路徑
-out:生成的請求文件路徑;如果自簽操作將直接生成簽署過的證書
-days:證書的有效時長,單位是day
(3)為CA提供所需的目錄及文件
# mkdir -pv /etc/pki/CA/{certs.crl,newcerts}
一般默認有上面三個目錄
# touch /etc/pki/CA/{serial,index,txt}
# echo 01 > /etc/pki/CA/serial
·要用到證書進行安全通信的服務器,需要向CA請求簽署證書
步驟:(以http為例)
(1)用到證書的主機生成私鑰
# mkdir /etc/httpd/ssl
# cd /etc/httpd/sl
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048 )
(2)生成證書簽署請求<提取出私鑰中的公鑰>
# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
(3)將請求通過可靠方式發送給CA主機
# scp /etc/httpd/ssl/httpd.csr root@IP.A.DD.R:/tmp/
(4)在CA主機上簽署證書
# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看證書中管的信息:
#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
-subject :給誰發布的
(5)把CA主機上簽署的證書發給http主機
·吊銷證書:
步驟:
(1)客戶端獲取要吊銷的證書的serial(在使用證書的主機上執行)
# openssl x509 -in /etc/pki/CA/certs/httpd.crt -nount -serial -subject
(2)CA主機吊銷證書
先根據客戶端提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致
吊銷:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要換成證書真正的序列號
(3)生成吊銷證書的吊銷編號(第一次吊銷證書時執行,以后吊銷證書不用執行)
# echo 01 > /etc/pki/CA/crlnumber
(4)更新證書吊銷列表
# openssl ca -gencrl -out thisca.crl
thisca.crl 是CA簽署的其他公鑰的簽名
查看crl文件
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
作業:用openssl實現證書申請
創建CA
(1)生成私鑰
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096
(2)生成自簽證書
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
(3)為CA提供所需的目錄及文件
# ls -ld /etc/pki/CA/{certs.crl,newcerts}
一般默認有上面三個目錄,無這3個目錄時,創建之
# touch /etc/pki/CA/{serial,index,txt}
# echo 01 > /etc/pki/CA/serial
要用到證書進行安全通信的服務器,需要向CA請求簽署證書
步驟:(以http為例)
(1)用到證書的主機生成私鑰
# mkdir /etc/httpd/ssl
# cd /etc/httpd/sl
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048 )
(2)生成證書簽署請求<提取出私鑰中的公鑰>
# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
(3)將請求通過可靠方式發送給CA主機
# scp /etc/httpd/ssl/httpd.csr root@IP.A.DD.R:/tmp/
(4)在CA主機上簽署證書
# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
(5)把CA主機上簽署的證書發給http主機
原創文章,作者:megedugao,如若轉載,請注明出處:http://www.www58058.com/48461
我們常常處于測試的目的會自建CA來模擬https協議的實現,以后學習中也會用的很多,望熟練掌握,嘗試著用腳本來實現CA主機的自簽和授權,挑戰一下自己