加密和解密技術
本章內容:
-
安全機制
-
對稱加密
-
不對稱加密
-
散列算法
-
PKI和CA
相關知識:
1)傳輸層協議:
TCP(面向連接),UDP(面向無連接),SCTP(流控協議)
2)port(端口):傳輸層協議都會提供端口,
端口(port)是標記進程的地址,進程向內核注冊才能使用某端口(獨占)
任何一個進程占領某個端口之后,其他進程進不能使用了;
3)同一主機上的進程間通信:
IPC,message qoeue(消息隊列),shm(共享內存),semerphor
4)不同主機間的進程通信:
通過套接字方式來實現(socket)
cip:port<– –>sip:port(客戶端ip和端口到服務端ip和端口)
5)監聽模式:LINTEN(ip:port),
無論有沒有人訪問,它都要打開自己的進程,并監聽在某個ip:port上,隨時等待客戶端請求;
為某些眾所周知的應用,事先分配好一個固定的端口(比如http的80端口)
6)SSL :Secure Socket Layer
http–>ssl–>https
http協議一但調用了ssl就變成了https,從而能夠完成安全通信
1.介紹
★ SSL 也就是Secure Socket Layer 叫做安全套接字協議,是一種應用層協議,主要用于數據傳輸的加密。OpeenSSL是SSL協議開源形式,是廣泛使用的商業及SSL工具,同時OpeenSSL也是一種命令行工具;
★ 在計算機網絡中,我們知道跨主機之間的進程通信是通過套接字方式實現的,服務器監聽在某個TCP Socket之上(IP:Port),客戶端在本地打開一個隨機的Socket,然后通過TCP/IP協議,將請求通過交換機、路由器層層轉發到目標服務器上,然后服務器可以判斷出客戶端請求的資源,進而轉交到應用層相關服務上,服務端應用進程從磁盤上獲得相應的資源信息,然后封裝成相應的網絡數據包格式以同樣的方式層層傳輸給客戶端對應的端口上。
★ 無論數據從應用層向下傳輸還是從下層到應用層傳輸,每個層次中的協議都僅僅是對數據進行封裝解封裝,而里面的數據本身并沒有發生變化,所以,數據在發送過程當中是什么還是什么,也就是明文發送的,沒有加密,任何人只要獲取到了相關的數據包就能通過其他方法獲知其中的銘文內容;因此就需要有一種加密機制能夠保護互聯網數據在傳輸過程中的隱秘性了;
★ NIST(美國國家標準與技術研究院)定義的安全屬性:
·保密性:數據保密性,隱私性
·完整性(不可篡改):數據完整性,系統完整性
·可用性
★ 攻擊類型:
·威脅保密性的攻擊:竊聽、通信量分析 ;
·威脅完整性攻擊:篡改,偽裝,重放,否認;
·威脅可用性的攻擊:拒絕服務(Dos)
★ 解決方案:
·安全機制:
加密解密;
數字簽名;
訪問控制;
數據完整性;
認證交換;
流量填充;
路由控制;
公證
·安全服務:用于抵御攻擊的服務
認證服務;
訪問控制服務;
數據保密性服務:連接保密性、無連接保密性、選擇域保密性、流量保密性
數據完整性服務;
不可否認性服務;
★ 設計原則:
·使用成熟的安全系統
·以小人之心度輸入數據
·外部系統是不安全的
·最小授權
·減少外部接口
·缺省使用安全模式
·安全不是似是而非
·從STRIDE思考
·在入口處檢查
·從管理上保護好你的系統
★ 安全算法
·常用安全技術
認證
授權
安全通信
審計
·密碼算法和協議:
對稱加密:數據加密(保密性)(算法:3DES,AES)
公鑰加密:身份認證,密鑰交換,數據加密 (RSA,DSA)
單向加密:數據完整性(MD5,SHA1…)
密鑰交換:RSA、DH、ECDH(橢圓曲線DH),ECDHE(臨時橢圓曲線DH)
認證協議
★ Linux系統:OpenSSL, gpg(pgp協議的實現)
2.常見的加密算法和協議
1)對稱加密
★ 對稱加密:加密和解密使用同一個密鑰
·DES:Data Encryption Standard,56bits
·3DES:
·AES:Advanced (128, 192, 256bits)
·Blowfish,Twofish
·IDEA,RC6,CAST5
★ 特性:
·加密、解密使用同一個密鑰,效率高;
·將原始數據分割成固定大小的塊,逐個進行加密;
★ 缺陷:
·密鑰過多;
·密鑰分發;
·數據來源無法確認
2)非對稱加密(公鑰加密)
★ 非對稱加密采用公鑰加密,同時還需要另一個秘鑰來解密,也就是私鑰;兩者統稱為密鑰對。
·公鑰:從私鑰中提取產生,公開給所有人;public key
·私鑰:通過工具創建,使用者自己留存,必須保證其私密性;secret key
★ 特點:
用公鑰加密數據,只能使用與之配對的私鑰解密;反之亦然
★ 功能:
·身份認證:私鑰擁有者用自己的私鑰加密的數據,只要用其公鑰能解密,即可認證其身份;私鑰加密的這個過程為數字簽名。
·密鑰交換:與被通信方之前,首先獲取到對方的公鑰,自己生成一個加密密碼,用對方的公鑰加密,并發送給對方;
·數據加密:適合加密較小數據(不常用,比對稱加密要慢3個數量級)
★ 缺點:
密鑰長,加密解密效率低下
★ 算法:
RSA(加密,數字簽名),DSA(數字簽名),ELGamal
★ 基于一對公鑰/私鑰對
用密鑰對中的一個加密,另一個解密
★ 實現加密過程:
·接收者
生成公鑰P和私鑰S
公開公鑰P,保密私鑰S
·發送者
使用接收者的公鑰P來加密消息M
將P(M)發送給接收者
·接收者
使用私鑰S來解密:M=S(P(M))
★ 實現數字簽名:
·發送者
生成公鑰/私鑰對:P和S
公開公鑰P,保密密鑰S
使用私鑰S來加密消息M
發送給接收者S(M)
·接收者
使用發送者的公鑰來解密M=P(S(M))
結合簽名和加密
分離簽名
3)單向加密
★ 只能加密,不能解密,因為解密過程是一個二次加密的過程;主要是提取數據的特征碼,即“數據指紋”
★ 特性:
·任意長度輸入
·固定長度輸出
·若修改數據,指紋也會改變(“不會產生沖突”)
·無法從指紋中重新生成數據(“單向”)
★ 功能:
數據完整性(完整性校驗)
系統賬號密碼校驗
★ 算法:
md5:Message Digest 5(消息摘要),128bits;
sha1:Secure Hash Algorithm 1(安全哈希算法) ,160bits
sha224,sha256,sha384,sha512
4)密鑰交換
★ 密鑰交換(IKE):雙方通過交換密鑰來實現數據加密解密;密鑰交換有兩種
公鑰交換:將公鑰加密后通過網絡傳輸到對方進行解密,這種方式很有可能別截獲破解,不常用;
DH:雙方共有一些參數,共同協商加密算法,除此之外雙方還有屬于自己的私有參數,通過共有參數、私有參數和算法信息來進行加密,然后雙方將計算后的結果進行交換,交換完成后再和屬于自己私有的參數進行特殊算法,經過雙反計算后的結果是相同的,而這個結果就是密鑰。
如:A有p和g兩個參數,A還有一個屬于自己的私有參數x;
B有p和g兩個參數,B還有一個屬于自己的私有參數y;
A和B有相同的加密算法即:
A:p^x%g
B:p^y%g
然后雙方交換計算后的結果,此時
A拿到B的p^y%g,B拿到A的p^x%g,雙方再和自己私有參數進行相同的算法,即
A:對p^y%g 再求x次方得(p^y%G)^x=p^xy%g
B:對p^x%g 再求y次方得(p^x%G)^y=P^xy%g
最后A和B的結果是一樣的
注意:整個過程中對于第三方人員來說只能獲取p,g兩個值,AB雙方交換的是經過計算后的值,因此這種加密算法是很安全的。
5)一次加密通信過程:
發送者:
1.使用單向加密算法提取生成數據的特征碼; (單向加密技術)
2.使用自己的私鑰加密特征碼附在數據的后面; (公鑰加密技術)
3.生成用于對稱加密的臨時密鑰;
4.用此臨時密鑰加密數據和已經使用私鑰加密后的特征碼;(對稱加密技術)
5.使用接收方的公鑰加密此臨時密鑰,附在對稱加密后的數據的后方;(密鑰交換技術)
接收者:
1.使用自己的私鑰解密加密的臨時密鑰,從而獲取對稱密鑰;
2.使用對稱密鑰解密對稱加密的 數據和私鑰加密的特征碼密文; 從而獲取數據和特征碼密文;
3.使用發送方的公鑰解密特征碼密文,從而獲取計算生成的特征碼;
4.使用與對方同樣的單向加密算法計算數據的特征碼,并與解密而來的特征碼進行比較。
6)CA和證書
★PKI: Public Key Infrastructure
公鑰基礎設施:
簽證機構:CA(Certificate Authority)
注冊機構:RA
證書吊銷列表:CRL
證書存取庫:
★X.509:定義了證書的結構以及認證協議標準
版本號:version
序列號:serial number CA用于唯一標識此證書;
簽名算法標志:
頒發者:即CA自己的名稱;
有效期限:兩個日期,起始日期和終止日期
主體名稱:證書擁有者自己的名字
主體公鑰:證書擁有者自己的公鑰信息
發行者的唯一標識:
證書主體的唯一標識
CRL分發點:
擴展信息
發行者簽名:CA對此證書的數字簽名
★驗證證書過程:
1.用CA的公鑰去解密CA的全名,能解密說明證書來源可靠;
2.用同樣的加密算法去加密證書取得特征碼,與解密出的特征碼相比較,如果二者相同,說明證書完整性可靠;
3.檢查證書的有效期限在不在當前合理的有效范圍內;
4.驗證主體名稱和期望通信的對方是否一致;
5.檢查證書是否被吊銷。
★ 證書類型:
證書授權機構的證書
服務器
用戶證書
★ 獲取證書兩種方法:
1.使用證書授權機構;
生成簽名請求(csr)
將csr發送給CA
從CA處接收簽名
2.自簽名的證書;
自已簽發自己的公鑰
3.SSL/TSL
1)介紹
★SSL: Secure Socket Layer
安全套接層,是為網絡通信提供安全及數據完整性的一種安全協議;
SSL為Netscape在1994年所研發,用以保障在Internet上數據傳輸之安全,利用數據加密(Encryption)技術,可確保數據在網絡之上傳輸過程中不會被截取及竊聽;
★TLS(傳輸層安全):Transport Layer Security(SSL的繼承版本)與SSL在傳輸層對網絡連接進行加密;
發展歷程:
1995:SSL 2.0 Netscape研發
1996: SSL 3.0
1999: TLS 1.0 IETE研發
2006: TLS 1.1 RFC(Request For Comments )4346
2008:TLS 1.2 當前使用
2015: TLS 1.3
★功能:機密性,認證,完整性,重放保護;
★分層設計:
最底層:基礎算法原語的實現;
向上一層:各種算法的實現;
再向上一層:組合算法實現的半成品;
用各種組件拼裝而成的各種成品密碼及協議軟件
★兩階段協議,分為握手階段和應用階段
握手階段(協商階段):
客戶端和服務器端認證對方身份(依賴于PKI體系,利用數字證書進行身份認證),并協商通信中使用的安全參數、密碼套件以及主密鑰。后續通信使用的所有密鑰都是通過MasterSecret生成。
應用階段:
在握手階段完成后進入,在應用階段通信雙方使用握手階段協商好的密鑰進行安全通信。
2)相關協議如下:
Handshake協議:包括協商安全參數和密碼套件、服務器身份認證(客戶端身份認證可選)、密鑰交換
ChangeCipherSpec 協議:一條消息表明握手協議已經完成
Alert 協議:對握手協議中一些異常的錯誤提醒,分為fatal和warning兩個級別,fatal類型錯誤會直接中斷SSL鏈接,而warning級別的錯誤SSL鏈接仍可繼續,只是會給出錯誤警告
Record 協議:包括對消息的分段、壓縮、消息認證和完整性保護、加密等
HTTPS 協議:就是“HTTP 協議”和“SSL/TLS 協議”的組合。HTTP over SSL”或“HTTP over TLS”,對http協議的文本數據進行加密處理后,成為二進制形式傳輸
3)SSL會話主要三步
·客戶端向服務器端索要并驗證證書;
·雙方協商生成“會話密鑰”
·雙方采用“會話密鑰”進行加密通信
詳細過程如下:
-
第一階段:ClintHello(客戶端發送加密通信請求)
支持的協議版本,比如tls1.2
客戶端生成一個隨機數,稍后用戶生成“會話密鑰”
支持的加密算法:比如AES、RSA
支持的壓縮算法
-
第二階段:ServerHello(服務器端回應)
確認使用的加密通信版本,比如tls1.2;
服務器端生成一個隨機數,稍后用于生成“會話密鑰”;
確認使用的加密算法;
發送服務器證書;
-
第三階段:
驗證服務器證書,在確認無誤后取其公鑰;(發證機構、證書完整性、證書的持有者、證書有效期、吊銷列表);
發送以下信息給服務器:
一個隨機數;
編碼變更通知,表示隨后的信息都將用雙方商定的加密方法和;
客戶端握手結束通知;
-
第四階段:
收到客戶端發來的第三個隨機數pre-master-key后,計算生成本次會話所用到的“會話密鑰”
向客戶端發送如下信息:
3.Openssl
1)介紹
★OpenSSL:是ssl的開源項目,有三部分組成:
·openssl: 多用途的命令行工具,每種功能都使專用的子命令來實現;
·libcrypto: 加密,解密庫文件;
·libssl:加密模塊應用庫,實現了ssl及tls;
★Openssl命令:
·兩種運行模式:交互模式和批處理模式
·opensslversion:程序版本號
·子命令分類:
標準命令:enc, ca, req, …
消息摘要命令(dgst命令)
加密命令(enc子命令)
命令如下:
[root@centos7 ~]# openssl version # 獲取openssl 版本號 OpenSSL 1.0.1e-fips 11 Feb 2013 [root@centos7 ~]# openssl d openssl:Error: 'd' 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) # 信息摘要命令 md2 md4 md5 rmd160 sha sha1 Cipher commands (see the `enc' command for more details) # 加密解密相關命令 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
4.Openssl命令
1)對稱加密:
★工具:openssl enc, gpg
★算法:3des, aes, blowfish, twofish
★enc命令:man enc
加密:openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
解密:openssl enc -d -des3 -a -salt -out testfile.cipher -in testfile
其中,des3 為算法,in 后面的testfile 表示要加密和解密的文件,out后面的testfile.copher表示加密和解密后輸出的文件名。
eopenssl enc命令演示:
[root@centos7 ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext #對文件fstab采用des3算法,加鹽進行加密后生成fstab.ciphertext文件 enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: [root@centos7 ~]# ls anaconda-ks.cfg Desktop Documents Downloads fstab fstab.ciphertext #加密后生層的文件 Music Pictures Public Templates Videos [root@centos7 ~]# cat fstab.ciphertext # 查看加密后生成的文件 U2FsdGVkX1/CcyhhtaQx0TdJn9947LJAiFvCVaAHm20+RRoNlq50ogUFd3cnYTqH n7W3TQqYVcQm0CKRpKY12FQWZRCvd6uTGYRDFnbraZcH+9gtrpE8K8YPo9bc4aXu tjxwMufZD6YHcgFrbeN6z/R2M5ogmq0yLCveCwEq86cm02FGSX34/hudbYYF8Bml pqzsGzjShkG3u22X5l4d7YPYB73a37UDIu/D98qSmVE3ehcITc8oI8YxZUV1/7rJ GLJaoSmZmSqMEsVgOCarGnI47hYv6WIrf0sI6zRi0S7gwC35XtP1Alfhe1kj2a4n nf0pkPo2wwtrt4esthEeYK5CpRo4vqVAQOwZbdnTZWHmWdzgMkR0/mtW8ZRF+jVy d5jecgeUP8tmNSJRuliewdsAs6HyzFJeOH3NiYcEqZrraJne8P1vQ2G3zyfJyz6A JOiJuD5CYbed2BqJSoS51Tjh9RDdA+UIwtySBipPYi3PYD26jErgbaFtN0lx5V2g 2hkEAvr3U+m88Ry4wg3qRuCam2VfKXRUOaIdraBFa76K3Ak0JPHGHUGGtL03J8Rf cRpmfJySV/NS+cCHwbcb2GSDpophxAryBYHO555uo8Z0e1q1wJ6+p9G13TNp7lII 5A2HNlQplAVqMutR7RuFZJRnEHYV2+oPL0WEIZFPD8bJ+DDgVbEnkp/6RijePekV gcROXMHKCy6pHul6cyfMKdTLXDezqjfSyr7Eshbyw7NOLme+/wotMKPKbCcz13aU nuxbM4QaaiVq3zQQ8SYXvNBddqq10OuJkM9Fqb7m/E1yOE1d2S9A8g== [root@centos7 ~]# openssl enc -d -des3 -a -salt -out fstab.plaintext -in fstab.ciphertext #對生成的加密文件進行解密后生成fstab.plaintext文件 enter des-ede3-cbc decryption password: [root@centos7 ~]# ls anaconda-ks.cfg Desktop Documents Downloads fstab fstab.ciphertext fstab.plaintext Music Pictures Public Templates Videos [root@centos7 ~]# cat fstab.plaintext # # /etc/fstab # Created by anaconda on Tue Aug 30 09:45:37 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=90880561-dca2-447b-a935-4c47e1bd03d8 / xfs defaults 0 0 UUID=219cc6c3-bd54-4bac-a47f-b498c491107f /boot xfs defaults 0 0 UUID=409f2fa0-f642-4cc2-9ed7-b20bda111d8d /usr xfs defaults 0 0 UUID=af279379-acbd-47f5-a814-870666bdd6d1 swap swap defaults 0 0
2)單向加密:
★工具:openssl dgst,md5sum, sha1sum, sha224sum,sha256sum…
★dgst命令:man dgst
openssl dgst -md5 [-hex默認] /PATH/SOMEFILE
md5sum /PATH/TO/SOMEFILE
★生成用戶密碼(passwd、openssl passwd)
passwd命令:man sslpasswd
openssl passwd -1 -salt SALT(最多8位) (-1表示md5加密算法)
★MAC: Message Authentication Code,單向加密的一種延伸應用,用于實現網絡通信中保證所傳輸數據的完整性機制
CBC-MAC
HMAC:使用md5或sha1算法
★生成隨機數:man sslrand
openssl rand -base64|-hex NUM
NUM: 表示字節數;-hex時,每個字符4位,出現的字符數為NUM*2
命令演示:
[root@centos7 ~]# md5sum fstab # 用md5sum工具單向加密 a6f9b86b73d17ac4a69d33583c0c5e96 fstab [root@centos7 ~]# openssl dgst -md5 fstab # 用openssl dgst工具加密,指明算法 MD5(fstab)= a6f9b86b73d17ac4a69d33583c0c5e96 # 可以看到雖然兩種加密的工具不一樣,但算法相同,所以生成的特征碼也相同
生成用戶密碼命令:
[root@centos7 ~]# openssl passwd -1 -salt 12345678 # 生成用戶密碼,salt最好用隨機數 Password: $1$12345678$TanElnkSiEcxWGxCzRxlf. [root@centos7 ~]# openssl passwd -1 -salt 12345679 Password: $1$12345679$BSsViINNl3LW6h3yHWRs2/
生成隨機數命令演示:
[root@centos7 ~]# openssl rand -base64 10 RrycEFwYSRKuUg== [root@centos7 ~]# openssl rand -base64 10 QITPCPNvb6jsBQ== [root@centos7 ~]# openssl rand -hex 10 97150eca6a7b1a3ef88f [root@centos7 ~]# openssl rand -hex 10 3a5a7f7d7081ae310f49 [root@centos7 ~]# openssl passwd -1 -salt `openssl rand -hex 4` # 命令替換生成隨機數 Password: $1$77309f38$BguLqZnBl/MCtf.C7YwK7/ [root@centos7 ~]# openssl passwd -1 -salt $(openssl rand -hex 4) Password: $1$d66fe996$DmTPN4hBOhj9xNDoP9clw/ [root@centos7 ~]# openssl passwd -1 -salt b3d36557 # 只要隨機數不變,則生成的密碼就不變 Password: $1$b3d36557$9nBLUPbdx6p2l3.lnX1vg.
2)公鑰加密:
★加密解密
算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
★數字簽名
算法:RSA, DSA, ELGamal
工具同上
★密鑰交換
算法:DH
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA
=======================================================================================
生成密鑰對(man genrsa)
★生成私鑰:
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS 生成的的私鑰不安全
(umask 077; openssl genrsa -out key.pri–des 2048)
私鑰僅自己能讀能寫,使用括號是啟用了一個子shell,僅對子shell有效,對父shell不受影響;
★從私鑰中提取公鑰:
openssl rsa -in /PATH/TO/SOMEFILE –pubout
★隨機數生成器(偽隨機數字)
熵池:在操作系統上有一個叫做熵池的地方,他是用來保存硬件中斷產生的隨機數(每一次硬件中斷都會產生一個隨機數)
/dev/random:僅從熵池中返回隨機數,隨機數耗盡時,取隨機數的進程將會被阻塞;
/dev/unrandom:僅從熵池中取隨機數,隨機數耗盡時,就通過偽隨機數生成器生成偽隨機數;(偽隨機數不安全)
熵池中隨機數的來源
硬盤IO中斷時間間隔
鍵盤IO中斷時間間隔
生成私鑰演示:
[root@centos7 ~]# openssl genrsa 1024 Generating RSA private key, 1024 bit long modulus ............++++++ .++++++ e is 65537 (0x10001) -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCb+FjWoo6+ajJVMBoroIMV0MufsQnjRQ5eTAFXjoDRTNsVjJ2h aDVkhEQFFVJgOEx7xuZhvBeaB0dcFeDLm/bTTfGWHSg/i+oF+vJy9WKFt529pwrU nMXgHJDzmgWD/rHlznfZEFSo2l3T7dnn3Mc++QMnVPFaK5To30O6x2JV6wIDAQAB AoGAfW+u6veTe3pm/nIQKhQOOKZSjRzRyfEIzDeuQJ9/5FQ+QkdzopLvleZ12ey6 8l10zXs6X1HpXVwLPPjvcHD/gNGo4mDI4x1pqfvAXzmQYCdjmlBggT71JHrUE/QE MMxYW099IPeDtNZBMqgXvKqF7l0/G7ZD5/3u/tq2ovJPtzkCQQDPMN0EF4hRAwZ3 pNZdGzyT8pokys3Q1wqR1N1++dM6kryGWjp8vFJWZdBzYQAtsvkIxsjnKOVtBXTH WaYwA+69AkEAwLZ+cibegyqcbCNifEtMile4cfXhfMkcvI90wRtu3Pl1LbXwWLb6 s/w+l48mxBBFg9bGPI3OV8zPA4Wq6rtVxwJBAKcqyJg9mGmspDIyWBalHBpOmlnn G2pNpqSE9/U0Al52+A76i8gKdfBpk2cUM32rskyHfp8rmvh8d31Ecta4xY0CQHbh 3Z0z5z6JUdfP+Fhu5zfMp4b9xO2C70xPPxpFfx2ociYRv8QqlPvlVwOOFr8Kvqd3 HfGLFUjKmsY0dly51k8CQFSjxS4jneZpEyHfRNKkz0IIQ6Hh5ulPtvv2QXNz/Cp7 eieQtiC17qSHLuiMMjtR0vK105L7MoaFo3iuVOn9jQ4= -----END RSA PRIVATE KEY----- [root@centos7 ~]# openssl genrsa 1024 > /tmp/mykey.private # 可以使用重定向到指定文件當中 Generating RSA private key, 1024 bit long modulus ........................++++++ ..........................++++++ e is 65537 (0x10001) [root@centos7 ~]# openssl genrsa -out /tmp/mykey1.private 1024 # -out指定輸出的文件,和重定向作用相同 Generating RSA private key, 1024 bit long modulus ...........................++++++ ..........++++++ e is 65537 (0x10001) # 但是生成的私鑰放在文件當中是不安全的,因此要設置權限盡自己可以看 [root@centos7 ~]# (umask 077;openssl genrsa -out /tmp/mykey2.private 2048) # 設置文件權限 Generating RSA private key, 2048 bit long modulus ...........................................................+++ .....................................................................................................................................................+++ e is 65537 (0x10001) [root@centos7 ~]# ls -l /tmp total 12 -rw-r--r-- 1 root root 887 Sep 28 17:12 mykey1.private # 屬組和其他用戶也有讀權限,不安全 -rw------- 1 root root 1675 Sep 28 17:14 mykey2.private # 屬主有讀寫權限 -rw-r--r-- 1 root root 887 Sep 28 17:11 mykey.private # 屬組和其他用戶也有讀權限,不安全 drwx------ 3 root root 16 Sep 28 08:41 systemd-private-c7c1f3e358e34fc2add5b3729e413ed8-cups.service-KSESlC drwx------ 3 root root 16 Sep 22 15:12 systemd-private-d276c273baee4a299b8d240ba604a5f2-cups.service-etgI6i
從私鑰中提取公鑰命令:
[root@centos7 ~]# openssl rsa -in /tmp/mykey2.private -pubout # 從私鑰中提取公鑰 writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwh/Zuj32Ibnc8X9wd4bU FgtMiIjPDu/STqlo311vspPHQ830Yytm5PjzVqAD4mUJ3/pHPGKHPWyP2KP1cZ4B ZVLW4nsV37GUsD4X6d19AQ/cg94CP0HZgW26iFY1jjZy59/R/MyH23Bw9dK1TDkK 9pQrVqK+KSTE04MikGtTL0GaqPklMm0PgJ9ULnQWxpuYrlWR9jasfmQVEgUkKXr/ dMqb+lSDYjWNPeRc274KHVMbrafmqc24rPCLU/QSZ3qloTY9fI3MeSO2Lh2dhOel q/dsVO27xkUnLTN+eC/BhjMrDwAw5Sj/xq0sb7+LVDKFpgyrZkltOTpZWbqNz7wx 2QIDAQAB -----END PUBLIC KEY-----
4.創建CA和申請證書
1)創建CA
★數字證書的獲取有兩種方法:
向RA注冊申請即公共信任的CA;
自己創建私有CA
openssl
OpenCA
★使用OpenSSL創建私有CA的步驟:
在確定配置為CA的服務上生成一個自簽證書,并為CA提供所需要的目錄及文件即可;
1)生成私鑰;
2)生成自簽署證書;
私鑰用于簽發證書時,向證書添加數字簽名使用;
證書:每個通信方都導入此證書至“受信任的證書頒發機構”
★openssl配置文件:/etc/pki/tls/openssl.cnf
工作目錄:/etc/pki/CA
★具體步驟:
1)生成私鑰文件/etc/pki/CA/private/cakey.pem
# (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 3650
其中:
-new:生成新證書簽署請求;
-x509:生成自簽格式證書,專用于創建私有CA時;
-key: 生成請求時用到的私有文件路徑;
-days n:證書的有效時間,單位是day;
-out /PATH/TO/SOMECERTFILE: 生成的請求證書路徑;如果自簽操作將直接 生成簽署過得證書
3)為CA提供所需的目錄及文件
# mkdir /etc/pki/CA/{certs,crl,newcerts} (存在的話就不用創建了)
# toouch /etc/pkl/CA/index.txt (數據庫文件)
# echo 01 > /etc/pki/CA/serial (序列號文件并給明第一個證書的序列號碼)
★給節點頒發證書
要用到證書進行安全通信的服務器,需要向CA請求簽署證書;
在證書申請的主機上進行如下步驟:
1)生成私鑰;
2)生成證書簽署請求; (注意:默認國家,省,公司名稱必須和CA一致)
3)將請求通過可靠方式發送給CA主機
在CA主機上簽發證書
1)驗證請求者信息;
2)簽署證書
3)把簽署好的證書發還給請求者
★吊銷證書(了解)
在客戶端獲取要吊銷的證書的序列號serial;
# openssl x509 -in httpd.crt -noout -serial -subject
在CA上,根據客戶提交的serial與subject信息,對比檢驗是否與index.txt文件中的信息一致;
吊銷證書;
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中SERIAL要替換成證書真正的序列號
生成吊銷證書的編號(第一次吊銷證書時才需要執行);
# echo 01 > /etc/pki/CA/crlnumber
更新證書吊銷列表
# openssl crl -gencrl -out THISCA.crl
1.創建私有CA步驟演示:
1)生成私鑰文件/etc/pki/CA/private/cakey.pem
[root@centos7 ~]# ls /etc/pki/CA/private/ # 查看私鑰文件為空 [root@centos7 ~]# (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@centos7 ~]# ls /etc/pki/CA/private/ cakey.pem [root@centos7 ~]# ll /etc/pki/CA/private/ # 查看文件,并確定其權限僅為屬主自己 total 4 -rw------- 1 root root 3247 Sep 28 19:03 cakey.pem
2)生成自簽證書
# 生成自簽證書指明私鑰文件,證書保存路徑,有效期限等 [root@centos7 ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 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]:Magedu # 組織(公司)名稱 Organizational Unit Name (eg, section) []:Ops # 所在崗位 Common Name (eg, your name or your server's hostname) []:ca.magedu.com # 證書持有者姓名或請求證書服務器的主機名 Email Address []:caadmin@magdeu.com # 郵件地址 [root@centos7 ~]# ls /etc/pki/CA cacert.pem # 生成的自簽證書 certs crl newcerts private
3)為CA提供所需的目錄和文件
[root@centos7 ~]# touch /etc/pki/CA/index.txt # 創建數據庫文件 [root@centos7 ~]# echo 01 > /etc/pki/CA/serial # 創建序列號文件并給明第一個證書的序列號碼 [root@centos7 ~]# ls /etc/pki/CA/ cacert.pem certs crl index.txt newcerts private serial
2.給節點頒發證書步驟演示
(假設CentOS 6為一個web服務器,要向客戶端提供http服務就需要證書文件,并把請求發送給CA進行簽署)
1)在證書申請的主機上生成私鑰
[root@CentOS6 ~]# rpm -q httpd # 這里以http服務為例 httpd-2.2.15-53.el6.centos.x86_64 [root@CentOS6 ~]# cd /etc/httpd/ [root@CentOS6 httpd]# ls conf conf.d logs modules run [root@CentOS6 httpd]# mkdir ssl # 在文件中創建ssl目錄 [root@CentOS6 httpd]# cd ssl # 在此目錄中生成私鑰 [root@CentOS6 ssl]# (umask 077;openssl genrsa -out httpd.key 2048) # 注意這里不是在 /etc/pki/CA下創建,只有作為CA時才在其下進行創建 Generating RSA private key, 2048 bit long modulus .............+++ .........................................................................................+++ e is 65537 (0x10001) [root@CentOS6 ssl]# ll total 4 -rw------- 1 root root 1675 Sep 28 16:55 httpd.key # 生成的私鑰文件
2)生成證書簽署請求:
[root@CentOS6 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 State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:Magedu Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:CentOS.magedu.com Email Address []:webmaster@magedu.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
3)把請求發送給CA
[root@CentOS6 ssl]# scp httpd.csr root@10.1.249.203:/tmp/ # 這里使用scp命令 The authenticity of host '10.1.249.203 (10.1.249.203)' can't be established. RSA key fingerprint is cf:7d:49:75:55:54:45:88:a3:dd:ff:f3:87:be:3f:06. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': yes Warning: Permanently added '10.1.249.203' (RSA) to the list of known hosts. root@10.1.249.203's password: httpd.csr 100% 1062 1.0KB/s 00:00 [root@centos7 ~]# ls /tmp/ # 查看文件 httpd.csr # 申請主機發送過來的文件 systemd-private-c7c1f3e358e34fc2add5b3729e413ed8-cups.service-KSESlC systemd-private-d276c273baee4a299b8d240ba604a5f2-cups.service-etgI6i
4)CA簽發證書
[root@centos7 ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365 # 簽發證書,-in指明要簽的證書文件位置,-out指明簽好后輸出的文件位置,必須放在certs下,指明期限 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: Sep 28 13:21:38 2016 GMT Not After : Sep 28 13:21:38 2017 GMT Subject: countryName = CN stateOrProvinceName = Beijing organizationName = Magedu organizationalUnitName = Ops commonName = CentOS.magedu.com emailAddress = webmaster@magedu.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 04:FD:4F:25:36:40:D1:CA:9A:2B:4C:AD:7D:C9:CD:18:34:E7:D0:33 X509v3 Authority Key Identifier: keyid:44:82:7B:4C:D4:19:C4:28:F9:72:41:1D:01:5D:B9:CB:84:9E:43:61 Certificate is to be certified until Sep 28 13:21:38 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 [root@centos7 ~]# cd /etc/pki/CA [root@centos7 CA]# ls cacert.pem crl index.txt.attr newcerts serial certs index.txt index.txt.old private serial.old [root@centos7 CA]# cat index.txt # 可以看到第一個簽署的證書編號為01 V 170928132138Z 01 unknown /C=CN/ST=Beijing/O=Magedu/OU=Ops/CN=CentOS.magedu.com/emailAddress=webmaster@magedu.com
5)把簽署好的證書發還給請求者
[root@centos7 CA]# scp certs/httpd.crt root@10.1.252.153:/etc/httpd/ssl The authenticity of host '10.1.252.153 (10.1.252.153)' can't be established. RSA key fingerprint is f7:91:35:d1:33:ab:e8:af:4c:cc:39:45:e7:12:2f:b3. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.1.252.153' (RSA) to the list of known hosts. root@10.1.252.153's password: httpd.crt 100% 5886 5.8KB/s 00:00
請求者查看證書
# 請求者收到后查看 [root@CentOS6 ssl]# ls httpd.crt(# 簽署的證書) httpd.csr httpd.key [root@CentOS6 ssl]# rm -f httpd.csr # 沒用的文件就可以刪除了 [root@CentOS6 ssl]# openssl x509 -in httpd.crt -noout -serial -subject # 查看序列號和主題 serial=01 subject= /C=CN/ST=Beijing/O=Magedu/OU=Ops/CN=CentOS.magedu.com/emailAddress=webmaster@magedu.com
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/49655
不是一般般厲害喲