史上最詳細的Openssl搭建及ssl原理解析

一、SSL:secure sokets layer(安全套接字層)

1.套接字的概念

兩個主機通信時,其實本質上也就是兩個進程之間的通信,而進程通信當然需要標記,所以就用端口號與IP地址的組合稱爲套接字,這樣就很容易理解了。

SSL的概念

SSL是在TCP/IP模型的應用層與傳輸層之間加上半層的SSL公共通用模塊,調用這個模塊http將會變成https。
圖中的黃線,表示沒有調用ssl模塊時的情況,紅線代表調用ssl模塊的情況,經過ssl時服務器端會使用算法對數據進行加密,並進行身份認證,使客戶端訪問服務器時更加安全。
在這裏插入圖片描述

二、SSL保證的目標與防範的攻擊

保密性confidentiality

目標: 對數據的保密性,使用算法對數據進行加密,保證數據傳輸時即時被其他黑客攔截到也不知道真實信息
典型攻擊: 竊聽,對通信量進行分析

完整性integrity

目標: 使用單向加密算法生成特徵碼,來保證數據的完整性
典型攻擊: 更改(對數據進行更改)、僞裝(通過IP僞裝接收端)、重放(第三方截取數據後雖然不知道其內容是什麼,但是會知道有什麼作用,可以一直重複的發給接收方,接收方誤以爲是發送方端的數據,會一直接收)、否認(下訂單卻否認沒下訂單)

可用性availability

目標: 保證數據的可用性,保證數據到達接收放依然是可用的
典型攻擊: 拒絕服務(DOS)利用TCP的漏洞,一直在與服務器發起TCP連接請求,但是連接後又會斷開,這樣就造成了服務器的資源浪費、分佈式拒絕攻擊(DDOS)第三方通過在網絡上抓取肉機,一起對服務器發起DOS攻擊,如果肉機數量過多,有可能會造成服務器的崩潰

三、解決方案

技術(加密或解密)、服務(用於抵禦攻擊的服務,也是爲了上述安全目標設計的安全服務)

1.加密或解密

傳統加密方法:替換加密方法、置換加密方法
現代加密方法:現代塊加密方法(將數據進行分塊通過算法進行逐個加密)

2.服務

認證機制:通過CA或者身份驗證進行訪問
訪問控制機制:沒有通過的不允許訪問或者設置允許訪問的條件

3.密鑰算法和協議

對稱加密、單向加密、認證協議

四、openssl介紹

1.簡介

一款開源的加密軟件,基於ssl/tls協議,實現密鑰證書管理、對稱加密、非對稱加密等
ssl協議:Netscape(網景公司)在1994年頒發的。
tls協議:國際電子工程師協會在1999年發佈的。

2.組成

libencrypt:加密解密庫,用於實現加密和解密的庫。
libssl:實現ssl安全通信機制的庫。
openssl:多用途命令行工具。

五、密鑰算法和協議

1.對稱加密

概述
特性:會將原始數據分割成固定的塊,來逐個使用相同的密鑰進行加密,傳輸到對端後使用相同的密鑰進行解密。
缺點:密鑰過多,因爲每次與用戶傳輸都要生成一個只屬於該用戶的密鑰來進行通信,密鑰分發困難,因爲密鑰沒有辦法傳輸。
算法:
DES(數據加密標準):56位密鑰,現在已經被破解了。
3DES:將原先的DES加密三次。
AES(先進加密標準):最新版的加密算法,192、256位密鑰
等…

在這裏插入圖片描述

2.公鑰加密技術

概述
將密鑰分爲公鑰和私鑰,首先發送方向接收方索要公鑰,接收方生成私鑰再從私鑰中提取公鑰後發送給發送方,發送方接收到公鑰後使用該公鑰加密要發送的數據發送給接收方,接收方再使用自己的私鑰來進行解密。(使用公鑰加密的數據必須使用與之對應的私鑰來進行解密)
公鑰:公鑰通過在私鑰中提取出來,可以公開給所有人,pubkey;
私鑰:通過工具來創建,使用者自己留存,必須保證私鑰的安全性,secret key;
用途
數字簽名:發送方使用自己的私鑰在證書上進行簽名,這樣其他人使用公鑰解密時會驗證發送方的身份。
密鑰交換:發送方用對方的公鑰加密一個對稱密鑰發送給對方,這樣就可以保證密鑰的傳輸安全性了。
算法
RSA(可以加密、解密也可以進行數字簽名)、DSA(可以加密但是不能解密所以只能作爲數字簽名)

3.單向加密

概述
只能進行加密,但是不能解密,在原始數據中使用算法提取定長特徵碼。
特性
定長輸出:用戶會自定一個特徵碼長度然後進行特徵碼提取。
雪崩效應:因爲是使用算法在數據內提取定長的特徵碼,所以其中特徵碼一旦丟失一位則不能通過驗證。
功能
由於其定長輸出和雪崩效應的特性,所以通常用於數據完整性驗證。
算法
md5、sha、sha224、sha256等…

六、IKE密鑰交換詳解

1.基於公鑰加密的對稱加密傳輸

1)加密發送數據過程

第一步:Alice生成數據,並使用單向加密算法計算出這段數據的特徵碼
第二步:Alice使用自己的私鑰加密這段特徵碼,並將結果附加在數據後面,生成數字簽名
第三步:Alice生成一個臨時的對稱密鑰並加密這整段數據和特徵碼
第四步:Alice獲取Bob的公鑰並使用Bob公鑰加密這整段數據
在這裏插入圖片描述

2)解密過程

第一步:Bob獲取到數據包後,首先使用自己的私鑰解密Alice使用自己的公鑰加密
第二步:使用對稱密鑰解密整段加密的內容
第三步:再使用Alice的公鑰解密特徵碼,使Alice的身份得到驗證(數字簽名)
第四步:Bob使用相同的單向算法計算這一段數據,並對照Alice發送過來的特徵碼,如果一致則接收數據,如果不一致則表名該數據已經被人篡改過會丟棄數據(驗證數據的完整性)
在這裏插入圖片描述

3)基於公鑰加密的對稱加密Bug(中間人攻擊)

第一步:Eve中間人假說自己是Bob並將自己的公鑰發送給Alice
第二步:接收Alice發送過來的數據包,查看併發送給Bob,並假說自己是Alice
第三步:這樣Bob就以爲是在跟Alice通信,而Alice也就以爲自己在跟Bob通信
在這裏插入圖片描述

3.DH算法

第一步:Bob生成p、g Alice生成p、g
第二步:Bob生成x,並生成計算p^x%g發送給Alice
Alice生成y,並計算p^y%g發送給Bob
第三步:Bob將接受的數據再加y平方p^xy%g
Alice將接受的數據再加x平方p^xy%g
#至此雙方密鑰交換完成,最後算法式子都爲相同的

七、中間人攻擊的終結者PKI(公鑰基礎設施)

1.組成

簽證機構CA:負責證書的簽發
註冊機構CR:證書註冊的接待窗口
證書吊銷列表CRL:證書吊銷或私鑰丟失後會添加一條證書失效條目到CRL列表中
證書存取庫:簽發的證書都在這裏,每次頒發證書時都會添加一條條目到存取庫中

2.證書的內容

x.509v3:定義了證書結構以及證書協議的認證標準
版本號:v1、v2還是v3
序列號:從01開始的序列號,代表第幾個證書
簽名算法ID:簽名時使用的算法
發行者名稱:CA的名稱
有效期限:證書有效期
主體名稱:個人的名字
主體公鑰:
發行者的唯一標識:標識號,CA的標識號,頒發者的唯一標識
主體的唯一標識:標識號,主體的標識號,擁有者的唯一標識
發行者的簽名:將上述的所有內容發行者通過單向加密計算出特徵碼然後用自己的私鑰加密特徵碼生成發行者簽名,用來做發行者的身份驗證

3.證書的頒發步驟

Alice首先將自己的公鑰發送給CA,CA使用特殊的技術做防僞標識並將認證的公鑰再發送回Alice,完成證書認證。
在這裏插入圖片描述

4.使用證書通信步驟

第一步:CA首先將自己的數字簽名發放出去,以證明自己CA的身份
第二步:雙方商量算法、對稱加密、公鑰加密和密鑰交換的算法,並查看對方的證書認證CA是否是自己信任的CA
第三步:Bob收到Alice的數據包後首先會使用CA的公鑰來解密證書中的發行者簽名,來驗證Alice的證書可靠來源,用同樣的單向加密特徵碼驗證證書的完整性
第四步:檢車有效日期和主題名稱,檢查證書吊銷列表
在這裏插入圖片描述

八、openssl的應用

1.ssl與tls的分層設計

最頂層

2.對稱加密實現

加密文件:fstab
[root@localhost ~] openssl enc -e -des3 -a -salt -in /etc/fstab -out /media/fstab.text
#-e:加密
#-des3:使用的是des3算法進行加密的
#可以使用的算法有很多可以使用“openssl enc?”這條命令來查看
#-a:使用bash64格式顯示
#-salt:加密時增加鹽可以增加加密的複雜度,但缺點是鹽如果相同則加密結果也相同
#-in:需要加密的文件
#-out:將加密文件輸出到的路徑和文件名
	enter des-ede3-cbc encryption password:
	Verifying - enter des-ede3-cbc encryption password:
#輸入加密密碼,這個密碼需要在解密時使用

[root@localhost ~] cd /media/
[root@localhost media] cat fstab.text
	U2FsdGVkX1+m7MJ8EILz2qbudiV9xe9sjeFFmzEI2h1KQ4W6Q+wm1fsX2orW1gZ6
	jCuBMHO4A/lrRdm9Xwkw9XXhWJ+SM4kkLOM8ua0boFUOiv+l1eIQGHgzF71Dd4xg
	ypHtnb3tzvZvZfOgXUhVR2towe+DQk/Kcnmk0giBBprNLVp1XETQuxVSldge4+Rx
	XVhdqWXbul4QiV3xi9SoRQq8bh00krDbx1HtpqdTk3v5JKDev+et+zXN5GC7oBtr
	ZeObQ4pHVXHV3uxe6iCj2OwqNhfoRoFLEMAZev0T7414gbA/pClUOqHXzMV0aKWc
	AiD0NCN8aeBoyvtH9H381PNH/bqX38IQBkuHIlC1VJBkiyR8X5mBXkcWNehrH1YA
	/Rj2nIAwh6M=
#生成的文件

解密文件:fstab.text
[root@localhost media] openssl enc -d -des3 -a -salt -out /media/fstab -in /media/fstab.text
#-d:解密文件

enter des-ede3-cbc decryption password:
#輸入剛纔的加密密碼

[root@localhost media] cat fstab
	#
	# /etc/fstab
	# Created by anaconda on Thu Nov 28 23:33:10 2019
	#
	# 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
	#
	/dev/mapper/centos-root /                       xfs     defaults        0 0
	UUID=294503a5-a82e-427a-a89d-35059beabf61 /boot                   xfs     defaults        0 0
	/dev/mapper/centos-swap swap                    swap    defaults        0 0

3.單向加密的實現(特徵碼)

#計算fstab.text的特徵碼
[root@localhost media] openssl dgst -md5 /media/fstab.text
	MD5(/media/fstab.text)= 72f7db27a52382af04974d7b6e8e1638
#-md5:使用md5算法來進行計算

4.生成用戶加密密碼

#生成用戶的加密密碼
[root@localhost ~] openssl passwd -1 -salt 12345
Password:	#輸入要設置的密碼
$1$12345$A7Krl2STMc2/TPiam.CTU1
#生成的加密密碼可直接加入到shadow文件中
#-1:使用md5算法進行加密
#-salt:加鹽,使密碼更加複雜,12345不是設置的密碼,只是加的鹽

5.生成隨機數

linux中的隨機數解釋

  1. /dev/random:僅從熵池中獲取隨機數,熵池隨機數耗盡後,阻塞;
  2. /dev/urandom:從熵池中獲取隨機數,熵池隨機數耗盡後,再通過軟件來生成隨機數,不阻塞;但是軟件生成的隨機數有可能會相同所以不安全
  3. 熵池:是描述系統混亂不堪的物理量,熵池越大表示系統運行的越混亂,有序性越差
  4. 熵池中隨機數的來源:硬盤IO中斷的時間間隔,鍵盤IO中斷的時間間隔
[root@localhost ~] openssl rand -hex 1024
#hex編碼進行生成的1024位的隨機數,hex編碼是64位的
[root@localhost ~] openssl rand -base64 1024
#使用base64編碼生成的1024位隨機數

6.生成用戶密碼與隨機數結合

[root@localhost ~] openssl passwd -1 -salt $(openssl rand -base64 4)
Password:
$1$+xPRiA==$HH9ta9lNHbyPVD3m.lh/U0
#通過隨機數加的鹽生成用戶的加密密碼

[root@localhost ~] openssl passwd -1 -salt +xPRiA==
Password:
$1$+xPRiA==$HH9ta9lNHbyPVD3m.lh/U0
#使用相同的鹽再來生成一個加密密碼,可以看到鹽一樣生成的加密密碼也是相同的

7、生成密鑰

生成私鑰
[root@localhost ~] (umask 077;openssl genrsa -out /bak/key 1024)
#帶上小括號表示這段命令在子進程shell中執行,原本shell不受影響
#genrsa:使用rsa進行計算私鑰
#-out:密鑰輸出路徑
#1024:1024位的私鑰
[root@localhost ~] cat /bak/key
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQD2SgMOWAyXyuHntfU50YILSwQd63yhONyjzn1tXc+QhxNq9Aoy
......==
-----END RSA PRIVATE KEY-----

生成公鑰
[root@localhost ~] openssl rsa -in /bak/key -pubout
writing RSA key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2SgMOWAyXyuHntfU50YILSwQd
63yhONyjzn1tXc+QhxNq9Aoy0eHHMvRo39eJMYi+Aw+xH0j35q5jvOyIAIi0e1Xq
LT+XMahXx1ZslmOwHz8TyGSxO+gIAeW8+QXJk0QceT6AjfyegUnZAe3NZ0EMviFK
CJkjcx0F3D/DhH9mjQIDAQAB
#在私鑰中提取的公鑰
#-pubout:展示爲文本格式的公鑰

九、搭建私有CA

1.查看配置文件

[root@localhost ~] cat /etc/pki/tls/openssl.cnf
#文件中有很多內容,這裏就只介紹一些重要的
#此文件是openssl的配置文件
.......
	####################################################################
	[ CA_default ]
	
	dir             = /etc/pki/CA           # 以下內容都屬於這個文件
	crlnumber       = $dir/crlnumber        # 吊銷證書的序列號crl
	crl             = $dir/crl.pem          # 存儲被吊銷的crl證書
	RANDFILE        = $dir/private/.rand    # 證書密鑰存儲目錄
	
	x509_extensions = usr_cert              # 證書的擴展內容
	
	name_opt        = ca_default            # 主體名稱
	cert_opt        = ca_default            # 證書的證明
	
	# copy_extensions = copy
	
	# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
	# crlnumber must also be commented out to leave a V1 CRL.
	# crl_extensions        = crl_ext
	
	default_days    = 365                   # 證書默認的有效期
	preserve        = no                    # keep passed DN ordering
......

2.構建私有CA

在確定配置CA生成一個自簽證書,併爲CA提供一個需要的目錄或文件即可。

1.準備工作
[root@localhost ~] mkdir -pv /etc/pki/CA/{cert,crl,newcerts}
#cert:證書存放目錄
#crl:吊銷證書存放位置
#newcerts:新建證書存放位置
[root@localhost ~] touch /etc/pki/CA/{serial,index.txt}
#serial:證書的序列號存放文件
[root@localhost ~] echo 01 > /etc/pki/CA/serial
#輸入證書起始序列號01

2.生成私鑰
[root@localhost ~] (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
#生成2048位的密鑰

3.生成自簽證書
#當指定私鑰進行簽署證書時,系統會自動在私鑰中提取出公鑰,其實是用公鑰來簽署的證書(注意!!!)
[root@localhost ~] openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
#-new:生成新證書的簽署請求
#-x509:生成自籤格式的證書
#-key:指定私鑰地址
#-out:簽署證書的存放路徑
#-days:指定證書有效天數
	You are about to be asked to enter information that will be incorporated
	If you enter '.', the field will be left blank.
	-----
	Country Name (2 letter code) [XX]:	#國家名
	State or Province Name (full name) []:	#省名
	Locality Name (eg, city) [Default City]:	#市名
	Organization Name (eg, company) [Default Company Ltd]:	#組織名
	Organizational Unit Name (eg, section) []:	#部門名
	Common Name (eg, your name or your server‘s hostname) []:	#主機名或服務器名
	Email Address []:	#管理員郵箱地址
[root@localhost ~] cat /etc/pki/CA/newcerts/01.pem 
#證書籤署後就可以在CA目錄下查看到新簽署的證書

4.客戶端生成私鑰
#新開啓一臺終端作爲CA服務器的客戶端,並生成私鑰
[root@localhost ~] mkdir /etc/httpd/ssl
[root@localhost ~] (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 1024)
	Generating RSA private key, 1024 bit long modulus
[root@localhost ~] cat /etc/httpd/ssl/httpd.key

5.客戶端生成證書籤署請求
[root@localhost ~] openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
-----
#輸入的內容要與證書服務器的信息一致
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:
Email Address []:

6.客戶端將請求通過可靠的方式傳輸給CA服務器
#這裏使用scp將客戶端的簽署證書請求發送給了服務器端
[root@localhost ~] scp /etc/httpd/ssl/httpd.csr 10.0.0.1:/media/
[email protected]'s password:
httpd.csr                                                                      100%  651     0.6KB/s   00:00

7.在CA服務器簽署證書
[root@localhost CA] openssl ca -in /media/httpd.csr -out /etc/pki/CA/cert/httpd.crt -days 365
#簽署證書
[root@localhost CA] openssl x509 -in /etc/pki/CA/cert/httpd.crt -noout -serial -subject
#查看證書內容
[root@localhost CA] scp /etc/pki/CA/cert/httpd.crt 10.0.0.2:/etc/httpd/ssl
#將證書傳送回客戶端

8.在服務器端吊銷證書
1)在客戶端獲取吊銷證書的serial
[root@localhost ~] openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
serial=01		#數值爲01
2)在CA服務器上吊銷證書
#根據客戶端提供的serial來對比CA服務上的index.txt的信息是否一致
[root@localhost CA] cat /etc/pki/CA/index.txt
3)在newcerts中吊銷證書的存檔
[root@localhost CA] openssl ca -revoke /etc/pki/CA/newcerts/01.pem
4)生成吊銷證書的編號
#只是第一次吊銷證書時使用,創建記錄吊銷證書編號的文件
[root@localhost ~] echo 01 > /etc/pki/CA/crlnumber
5)更新證書吊銷列表
[root@localhost ~] openssl ca -gencrl -out /etc/pki/CA/crl/thisca.crl
6)查看crl文件
[root@localhost ~] openssl crl -in /etc/pki/CA/crl/thisca.crl -noout -text
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章