目錄
一、數據安全的基本特點
二、數據的加密算法和協議
三、數字證書CA
四、PKI概述
五、OpenSSL的組成
六、使用OpenSSL構建私有CA
一、數據安全的基本特點
保密性:confidentiality;保證數據不被其他非法用戶所獲得
完整性:integrity(數據完整性和系統完整性)
可用性:available 保證數據能夠被用戶實時調用及查看
二、數據的加密算法和協議
1.加密或解密的方法:
傳統加密方法:
替代加密算法
置換加密方法
現代加密方法:
現代塊加密方法:把數據切割爲固定大小的塊,分別對每塊數據進行單獨加密,後一塊和前一塊基於某種鏈式機制,進行某種特殊的運算,緊密聯繫在一起。
2.加密算法和協議:
(1)對稱加密:加密和解密使用同一個密鑰。
加密過程:(圖片僅幫助理解)
常見的算法:
DES:Data Encryptionstandard(數據加密標準) 現代加密算法,它使用56位的密鑰對數據進行加密。
3DES:Triple DES(相當於DES三個數量級)現代加密算法,它使用3條56位的密鑰對數據進行三次加密。
AES:AdvancedEncryption Standard(高級加密標準)AES加密數據塊分組長度必須爲128比特,密鑰長度可以是128比特、192比特、256比特中的任意一個(如果數據塊及密鑰長度不足時,會補齊)。
商業加密算法:Blowfish,IDEA,RC6,CASTS
特性:
● 加密、解密使用同一個密鑰;
● 將原始數據分割成爲固定大小的塊,逐個進行加密;
(2)公鑰加密:密鑰分爲公鑰和私鑰(成對出現)
公鑰:從私鑰中同提取產生;可以公開給所有人;pubkey
私鑰:通過工具創建,使用者自己留存,必須保證其私密性;secret key;
特點:用公鑰加密的數據,只能使用與之配對兒的私鑰解密;
用途:
數字簽名:主要在於讓接收方確認發送方的身份。
密鑰交換:發送方用對方公鑰加密一個對稱密鑰,併發送給對方。
身份認證:發送方用自己的私鑰加密數據特徵碼,接收方用對方的公鑰進行解密。依賴數 字簽名,發送方用自己的私鑰加密數據特徵碼的結果就是數字簽名。數字簽名就是爲了完成身 份認證的。
公鑰加密通信過程:
發送方
單向加密,計算數據的特徵碼
用自己的私鑰加密特徵碼,並將結果附加在數據後,
生成一個臨時的對稱密鑰,並用對稱密鑰加密整段數據
獲取對方公鑰,並使用對方公鑰,加密臨時對稱密鑰,並附加在數據後,發送給對方
接收方:
使用自己的私鑰解密加密的對稱密鑰
用對稱密鑰解密加密的數據
用對方的公鑰解密特徵碼,如果能解密,對方身份得到驗證
用單向加密計算數據的特徵碼與源文件進行比較,數據完整性得到驗證
算法:
RSA,DSA,ELGamal(商業加密算法);
DSS : Digtal Signature Standard(數字簽名標準)
只能簽名不能加解密
DSA:DigtalSignatute Algorithm(數字簽名算法)既能簽名又能加解密,功能強大
(3)單向加密:即提取數據指紋(即特徵碼),只能加密,不能解密;
特性:定長輸出、雪崩效應;
功能:完整性驗證
算法:
MD5:Message Digest5(消息摘要), 128bits
sha1 160bits, sha224, sha256, sha384, sha512
(4)密鑰交換:IKE ( Internet Key Exchange )
常見的實現方法:
公鑰加密
DH(Deffie-Hellman)算法
三、數字證書CA
公鑰在網絡傳輸過程中,無法保證可信度,容易被竊取或僞裝,所以我們就需要一個受信任的第三方機構(CA),來保證公鑰信息的安全分發。
1.數字證書CA的頒發
用戶首先產生自己的密鑰對,並將公共密鑰及部分個人身份信息傳送給認證中心。認證中心在覈實身份後,將執行一些必要的步驟,以確信請求確實由用戶發送而來,然後,認證中心將發給用戶一個數字證書,該證書內包含用戶的個人信息和他的公鑰信息,同時還附有認證中心的簽名信息。用戶就可以使用自己的數字證書進行相關的各種活動。
2.如何對對方的數字證書進行驗證
用戶使用CA 的公鑰對那個證書上的簽字進行驗證,一旦驗證通過,該證書就被認爲是有效的。證書實際是由證書籤證機關(CA)簽發的對用戶的公鑰的認證。
3.證書驗證的主要內容:
用戶先獲得CA自己的證書,用CA的公鑰解密CA的證書,驗證CA的可靠性,CA的證書是由CA自己所頒發的。
(1)用戶使用CA的公鑰解密對方的證書,能解密說明證書來源可靠;
(2)然後用同樣的加密算法加密證書,取得特徵碼,與解密的特徵碼比較,如果相同,證書完整性可靠;
(3)檢查證書的有效期限;
(4)驗證主體名稱和期望通信的對方是否一致;
(5)檢查證書是否被吊銷。
至此,證書驗證過程結束。
四、PKI : Public Key Infrastructure
公鑰基礎設施:
簽證機構:CA 用戶在註冊機構註冊以後,CA判明申請者的身份後,便爲他分配一個公鑰,並且 CA 將該公鑰與申請者的身份信息綁在一起,併爲之簽字後,便形成證書發給申請者,並在證書存取庫進行備份。
註冊機構:RA,一般用戶在註冊CA時的註冊機構。
證書吊銷列表:CRL,用戶如果將自己的私鑰丟失,就可以申請吊銷自己的證書。
證書存取庫:CB,發出證書的存放的數據庫,如果用戶的證書丟失,可以在這兒找到。
x509V3:定義了證書的結構以及認證協議標準
版本號:指出該證書使用了哪種版本的X.509標準
序列號:由CA給予每一個證書分配的唯一的數字型編號
簽名算法ID:用來指定CA簽署證書時所使用的簽名算法
發行者名稱:CA的名稱
有效期限:證書起始日期和時間以及終止日期和時間
主體名稱:證書持有人唯一的標識符
主題公鑰:包括證書持有人的公鑰、算法
發行者的唯一標識(可選項)
主體的唯一標識(可選項)
擴展
發行者的簽名:CA對此證書的數字簽名,用於驗證證書是自己的簽發的
五、OpenSSL的組成
1.OpenSLL協議工作原理
(1)在TCP/IP協議下的實現過程
(2)客戶端和服務器端的會話原理(圖片未必精確,輔助理解)
SSL客戶端服務器端會話過程:
客戶端生成一個隨機數,稍後用戶生成“會話密鑰“,客戶端支持的加密算法,比如AES,RSA以及
支持的壓縮算法。
服務器端生生一個隨機數,稍後用於生成“會話密鑰”,雙方協商通信所使用的加密算法,服務器
端向客戶端發送服務器端的證書
客戶端驗證服務器證書(發證機構,證書完整性、證書持有者、證書有效期、吊銷列表)在確認無
誤後取出其公鑰;發送一個隨機數,編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰
發送;至此客戶端握手結束通知;
服務器收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話所有用到的“會話密
鑰“,向客戶端發送變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;服務端握手結
束通知;
2.OpenSSL支持的子命令
標準命令:enc,ca,req,genrsa,...
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) #消息摘要命令,使用dgst調用,加密時支持的算法 md2 md4 md5 rmd160 sha sha1 Cipher commands (see the `enc' command for more details) #加密命令,使用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
對稱加密:
工具: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
單向加密:
工具:openssl openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
生成用戶密碼:
工具:passwd, openssl passwd
~]# openssl passwd -1 -salt SALT
生成隨機數:
openssl rand
~]# opensll rand -hex NUM ~]# opensll rand -base NUM
公鑰加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
數字簽名:
算法:RSA, DSA, ELGamal
工具:penssl rsautl, gpg
密鑰交換:
算法:DH
生成私鑰: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS) 提出公鑰: ~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
3.如何使用OpenSSL進行對稱加密
(1) 對稱加密
示例:解密解密當前目錄下的anaconda-ks.cfg文件
[root@localhost ~]# cp /etc/fstab ./ #將/etc/fstab文件複製至當前目錄下 [root@localhost ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher #加密操作 enter des-ede3-cbc encryption password: #加密是用到的密碼 Verifying - enter des-ede3-cbc encryption password: [root@localhost ~]# cat fstab.cipher #查看加密後的文件 U2FsdGVkX19vosbARtM7zk0M+f8c+StIW8TR7mOLAQoc30fhhXF9gGYjiRT4Uzou Qq9B/SSoHP/jbC9PiLiMRNxktyFkCqOPMyql5W2SumcxD4bSPKy0MHpKs8UP//LZ JODM4ImWvXIY+qjmeV52j4j75BKPIwMEVSLsbjMBVI8IEDmVMi6T8z78GJFpKZpW DMKcR6S1oarHdCnrrPFAKYyUr2N3qjuY8eGrce7cxpG9NrqvIgGG9yvWHodlUa0Y C5T8ZNMrLokdV/5Rd0jJOuykvxHSPsvUI1S3jYojAsU4S5H3IAeSW/3OkGIW8dr1 GLL/Gjxk+irQI+BxepKqtHU9coxTKzZhE7FdSNYzsAWXfm2DoPa9z4YPafvMqMHu lN6ra6daLNERZdwr5rDvEn19q7Swcqd9mOlwVpk4W7X4gxeSbFp2/orm9BFDdmNV aeXaKQjEsZiA/sc1V8TbHY66bzyvDay9DIXSVaYAhBrZV2Kkxrv7GCV/PrOeVLkN 2UR9i6rZrHvJyQA2UJqPzIEOYHI3hV0inJVyzsOOIJoOKEdnlaxktPb0mbeoeb7C Kf/Pr2r3ToUFwjb2WKhVe+nJCKsL2b5TRptEiHJaxzhQDdg7kv3AsoqIO/X8PzUV IOr5jG/2zyDKh8a2uLODXBSYEtMLTqw7709ZMntFY8Mh0tVdWI8ygTfre6gmPqij chHEDj7fEUa4o/jKF+x5s0pWE8XpUaktucz45fOFl5SoOHbL8x25gaqEAfAhSax8 OsWETzvML0kCf/dcUZixb3MBkaTHdUZIozbjVmNtJJa4lqPxbxoQig==
解密加密後的文件
六、使用OpenSSL構建私有CA
注:此處申請CA的服務器和CA主機是分別爲兩臺CentOS 7主機
1.建立私有CA:
Openssl
OpenCA
openssl命令配置文件: /etc/pki/tls/openssl.cnf
#這裏只列出CA默認的經常用到的部分 [CA_default ] dir = /etc/pki/CA # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number 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 RANDFILE = $dir/private/.rand # private random number file
2.構建私有CA:
在確定配置爲CA的服務上生成一個自簽證書,併爲CA提供所需要的目錄及文件即可;
步驟:
(1) 生成私鑰
[root@localhost ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) Generating RSA private key, 4096 bit long modulus ..........................................++ ..................................................................................................................++ e is 65537 (0x10001) [root@localhost ~]# ls -l /etc/pki/CA/private/cakey.pem #查看文件權限確保不能被他人訪問 -rw-------. 1 root root 3243 1月 5 01:57 /etc/pki/CA/private/cakey.pem
(2)生成自簽證書
[root@localhost ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- 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]:CTO Organizational Unit Name (eg, section) []:technology Common Name (eg, your name or your server's hostname) []:localhost Email Address []:[email protected]
-new:生成新證書籤署請求;
-x509:生成自籤格式證書,專用於創建私有CA時;
-key:生成請求時用到的私有文件路徑;
-out:生成的請求文件路徑;如果自籤操作將直接生成簽署過的證書;
-days:證書的有效時長,單位是day;
(3)爲CA提供目錄和文件
[root@localhost ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts} #創建CA所需要的目錄 [root@localhost ~]# touch /etc/pki/CA/{serial,index.txt} #創建CA需要的文件存儲序列號和索引文件 [root@localhost ~]# echo 01 > /etc/pki/CA/serial #將序列號定向輸出至serial文件中
要用到證書進行安全通信的節點服務器,需要向CA請求籤署證書(以httpd爲例)
步驟:
(1) 用到證書的主機生成私鑰,首先確保當前主機已經安裝了httpd服務
[root@localhost ~]# rpm -q httpd #查看當前主機是否安裝httpd服務 httpd-2.2.15-45.el6.centos.x86_64 [root@localhost ~]# cd /etc/httpd/ [root@localhost httpd]# mkdir ssl [root@localhost httpd]# cd ssl/ [root@localhost ssl]# (umask 077; openssl genrsa -out httpd.key 2048) #生成私鑰
(2) 生成證書籤署請求
[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365 #生成證書籤署請求 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN #填寫申請簽署的信息,此處務必和CA主機的信息一致 State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:CTO Organizational Unit Name (eg, section) []:technology Common Name (eg, your name or your server's hostname) []:localhost #此處的主機名爲服務器域名 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@localhost ssl]# ll #使用ll命令可以看到當前目錄下生成了一個httpd.csr的文件 total 8 -rw-r--r-- 1 root root 1005 Jan 4 17:36 httpd.csr -rw------- 1 root root 1675 Jan 4 17:35 httpd.key
(3) 將請求通過可靠方式發送給CA主機
使用scp命令將該文件傳輸至CA主機
注:scp(Security copy)是在Linux下進行遠程拷貝文件的命令,基於ssh登錄
[root@localhost ssl]# scp httpd.csr [email protected]:./ #爲了方便此處將文件傳輸至當前目錄 The authenticity of host '172.16.249.123 (172.16.249.123)' can't be established. RSA key fingerprint is 75:3e:1f:63:a9:e0:ba:c1:2b:f9:f3:28:75:d7:26:0a. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': yes Warning: Permanently added '172.16.249.123' (RSA) to the list of known hosts. [email protected]'s password: httpd.csr 100% 1005 1.0KB/s 00:00
(4) 在CA主機上籤署證書
[root@localhost ~]# openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.ctr -days 365 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: #以下顯示申請的節點服務器的信息 Serial Number: 1 (0x1) Validity Not Before: Jan 4 18:45:20 2016 GMT Not After : Jan 3 18:45:20 2017 GMT Subject: countryName = CN stateOrProvinceName = Beijing organizationName = CTO organizationalUnitName = technology commonName = localhost X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: B6:47:E9:94:5D:B0:4E:27:A4:C4:D6:F7:71:0C:E7:E5:69:34:92:F6 X509v3 Authority Key Identifier: keyid:24:52:08:3D:06:76:BB:96:83:91:2A:22:9C:4D:D8:FB:3B:36:BC:58 Certificate is to be certified until Jan 3 18:45:20 2017 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
(5)頒發證書給節點服務器
[root@localhost ~]# scp /etc/pki/CA/certs/httpd.ctr [email protected]:/etc/httpd/ssl/
至此,CA證書籤發完成。
3.吊銷CA證書
僅作測試使用,在真實的生產環境很少用到。
(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/SERIAL.pem
其中的SERIAL要換成證書真正的序列號;
示例
(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
以上爲簽署私有CA及吊銷CA的全過程,難免有不足之處,懇請大家多多指正。