網絡安全背景
? ? ? ? 網絡就是實現不同主機之間的通訊。網絡出現之初利用TCP/IP協議簇的相關協議概念,已經滿足了互連兩臺主機之間可以進行通訊的目的,雖然看似簡簡單單幾句話,就描述了網絡概念與網絡出現的目的,但是為了真正實現兩臺主機之間的穩定可靠通訊,其實是一件非常困難的事情了,如果還要再通訊的基礎上保證數據傳輸的安全性,可想而知,絕對是難上加難,因此,網絡發明之初,并沒有太關注TCP/IP互聯協議中的安全問題。
? ? ? ? 對于默認的兩臺主機而言,早期傳輸數據信息并沒有通過加密方式傳輸數據,設備兩端傳輸的數據本身實際是明文的,只要能截取到傳輸的數據包,就可以直接看到傳輸的數據信息,所以根本沒有安全性可言。
早期利用明文方式傳輸的協議有:FTP、HTTP、SMTP、Telnet等。
數據加密算法
網絡安全涉及很多方面,而網絡數據的安全傳輸通常會面臨以下幾方面的威脅:
1.數據竊聽與機密性:?即怎樣保證數據不會因為被截獲或竊聽而暴露。
2.數據篡改與完整性:?即怎樣保證數據不會被惡意篡改。
3.身份冒充與身份驗證:?即怎樣保證數據交互雙方的身份沒有被冒充。
針對以上幾個問題,可以用以下幾種數據加密方式來解決(每種數據加密方式又有多種不同的算法實現):
數據加密方式 | 描述 | 主要解決的問題 | 常用算法 |
對稱加密 | 指數據加密和解密使用相同的密鑰 | 數據的機密性 | DES,AES |
非對稱加密 | 也叫公鑰加密,指數據加密和解密使用不同的密鑰-密鑰對 | 身份驗證 | DSA,RSA |
單向加密 | 指只能加密數據,而不能解密數據 | 數據的完整性 | MD5,SHA系列算法 |
普通算法
網站此時利用普通常見算法,針對密碼加密,基本保證數據再傳輸時候,不是明文
但是黑客可能會有一個龐大的算法本,里面記錄了常見的密碼和加密后的密文,一一對應,然后可以利用程序大量計算,反解出明文密碼撞庫是黑客通過收集互聯網已泄露的用戶和密碼信息,生成對應的字典表,嘗試批量登陸其他網站后,得到一系列可以登錄的用戶。 很多用戶在不同網站使用的是相同的帳號密碼,因此黑客可以通過獲取用戶在A網站的賬戶從而嘗試登錄B網址,這就可以理解為撞庫攻擊。
?
對稱加密?
?
?
?
對稱加密算法,如其名,就是使用同一個秘鑰進行加密和解密。優點是速度較快,適合對數據量比較大的數據進行加密。缺點是密鑰的保存方式需要保證,一旦加密或者解密的哪一方泄漏了密鑰,都會導致信息的泄漏。常用的對稱加密算法有:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6、AES。
非對稱加密
?
簡單理解,比喻關系
公鑰---鎖
私鑰---開鎖鑰匙私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。
比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對消息加密,那么只有私鑰的持有人--銀行才能對你的消息解密。與對稱加密不同的是,銀行不需要將私鑰通過網絡發送出去,因此安全性大大提高。
常用的非對稱假面算法有:RSA,ECC,Diffie-Hellman,El Gamal,DSA(數字簽名用)
雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。為了解釋這個過程,請看下面的例子:
1.使用對稱加密,速度快
2.使用非對稱加密的方式,針對第一步的秘鑰加密傳輸(1) 超哥需要在銀行的網站做一筆交易,他的瀏覽器首先生成了一個隨機數作為對稱密鑰。(2) 超哥的瀏覽器向銀行的網站請求公鑰(非對稱加密的公鑰~~)。(3) 銀行將公鑰發送給超哥。(4) 超哥的瀏覽器使用銀行的公鑰將自己的對稱密鑰加密(這里是重點,已經是【對稱加密+非對稱加密】)。(5) 超哥的瀏覽器將加密后的對稱密鑰發送給銀行。(6) 銀行使用私鑰解密得到超哥瀏覽器的對稱密鑰。(7) 超哥與銀行可以使用對稱密鑰來對溝通的內容進行加密與解密了。
總結
1.對稱加密方式,加密解密使用同樣的密鑰,速度較快,但是密鑰需要在網絡中傳輸,因此可能被截獲,不安全2.非對稱加密,使用一對密鑰,公鑰,私鑰,因此安全性很高,但是加密和解密速度很慢3.常用的方式是,結合兩種加密方式,效率與安全性都有又了保障。
如何安全獲取公鑰
?
?1) A和B端首先生成自己的公鑰和私鑰的密鑰對,為了使對方能相信自己的公鑰信息,將自己的公鑰信息告知給第三方發證機構,利用第三方機構對自己的公鑰進行公證。第三方機構會制作一個數字證書(機構 編號 以及發證機構的戳),并且第三方機構也要給自己設置一個合法的公鑰和私鑰,并且公鑰設置為第三方機構的公鑰證書。
2) 發證機關計算出數字證書數據的特征碼,并用自己的私鑰進行加密,并將加密的信息附加到特征碼后成為數字簽名。
3) A和B兩端獲得公正過的證書信息,并通過證書信息傳遞,得到對方的公鑰。
4) A和B兩端與第三方機構建立連接,獲得第三方證書,通過第三方證書獲得第三方公鑰,利用第三方公鑰只要能解密數字簽名即可。
Openssl軟件
在傳輸層和應用層之間。ssl層
?
?
?openssl實踐
openssl由三部分組成:
1.libcrpto:通用加密庫
2. libssl:TSL/SSL組成庫,基于會話實現了身份認證,數據加密和會話完整性。
3. openssl:提供命令行工具,例如模擬創建證書。
openssl命令行
# 檢查版本
[root@chaogelinux ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017# 配置文件
[root@chaogelinux ~]# cat /etc/pki/tls/openssl.cnf#獲取openssl命令操作
[root@chaogelinux ~]# openssl -?
openssl:Error: '-?' is an invalid command.# 標準命令
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
...# 信息摘要命令,單向加密命令
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# 測試機器對openssl支持的加密算法進行速度測試,檢測服務器性能
openssl speed
【openssl加密命令】
語法
openssl enc -加密算法 -in filename -out filename # 對文件加密[root@chaogelinux ~]# cat my.pwd
yu:123
[root@chaogelinux ~]#
[root@chaogelinux ~]#
# 輸入密碼后加密成功,超哥這里是888888
[root@chaogelinux ~]# openssl enc -des3 -salt -a -in my.pwd -out my.pwd.des3
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:#解密文件
[root@chaogelinux ~]# cat my.pwd.des3
U2FsdGVkX19ZDOFtbdZz3QNu+bxm3DKd
[root@chaogelinux ~]## 輸入密碼后,解密文件
[root@chaogelinux ~]# openssl enc -des3 -d -salt -a -in my.pwd.des3 -out my.pwd.src
enter des-ede3-cbc decryption password:
[root@chaogelinux ~]#
[root@chaogelinux ~]# cat my.pwd.src
yu:123參數解釋:
enc openssl把眾多的對稱加密算法,統一集成在了enc指令,用法是 enc -算法名
-des3 指定算法
-d 指定解密
-e 指定加密
-salt 密碼加鹽,防止密碼被破解
-a 基于base64位編碼,可選參數
【openssl創建私有證書】
1.創建私鑰和公鑰,模擬證書頒發機構生成證書,生成一對密鑰
# 指定私鑰長度1024,并且將生成的私鑰信息保存在文件里,且利用小括號功能,修改子shell的umask
[root@chaogelinux ssl_cert]# (umask 077;openssl genrsa -out server1024.key 1024)
Generating RSA private key, 1024 bit long modulus
..........++++++
...................++++++
e is 65537 (0x10001)# 讀取私鑰文件,選擇非對稱加密算法rsa,生成公鑰,寫入到文件中
[root@chaogelinux ssl_cert]# openssl rsa -in server1024.key -pubout -out server1024.key.pub# 檢查文件
[root@chaogelinux ssl_cert]# ls
server1024.key server1024.key.pub# 生成自簽的證書
[root@chaogelinux ssl_cert]# openssl req -new -x509 -key server1024.key -out server.crt -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) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:chaoge
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:pythonav.cn
?
Nginx部署https
? ? ? ? 利用證書實現HTTPS訪問Nginx服務,需要nginx使用ssl模塊配置HTTPS支持,默認情況下ssl模塊并未被安裝,如果要使用該模塊則需要在編譯時指定–with-http_ssl_module參數,安裝模塊依賴于OpenSSL庫和一些引用文件,這些文件并不在同一個軟件包中,通常這個文件名類似libssl-dev。?
? ? ? ? nginx的https協議需要ssl模塊的支持,我們在編譯nginx時使用--with-http_ssl_module參數加入SSL模塊。還需要服務器私鑰,服務器證書,如果是公司對外環境,這個證書需要購買第三方的權威證書,否則用戶體驗得不到保障
部署https實踐
1.創建Nginx需要的證書文件
確保機器安裝了openssl和openssl-devel,創建證書
yum install openssl openssl-devel -y 2.確保nginx支持了ssl模塊,查看nginx編譯信息即可
nginx -V3.模擬證書頒發機構CA創建證書
進入nginx安裝目錄,便于管理證書
[root@chaogelinux ~]# cd /opt/ngx112/
[root@chaogelinux ngx112]# mkdir key
[root@chaogelinux ngx112]# cd key/# 生成私鑰文件,利用字shell降低文件權限
[root@chaogelinux key]# (umask 077;openssl genrsa -out server1024.key 1024)
Generating RSA private key, 1024 bit long modulus
.++++++
...++++++
e is 65537 (0x10001)# 自己簽發證書,crt證書擴展名
[root@chaogelinux key]# openssl req -new -x509 -key server1024.key -out server.crt -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) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:chaoge
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:pythonav.cn
Email Address []:yc_uuu@163.com# 向機構申請證書,我們這里生成的是證書請求文件,而不是直接生成證書了,運維發送該文件給機構,請求合法證書
[root@chaogelinux key]# openssl req -new -key server1024.key -out server.csr
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) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:chaoge
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:pythonav.cn
Email Address []:yc_uuu@163.com# 針對這個請求文件,做一個加密處理,告知辦法機構,可以用這個密碼解密,了解公司信息,也可以直接回車不寫密碼
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:# 一般這個證書頒發,需要等到一周內的時間,因此我們直接使用本地的自己簽發的證書即可,進行練習4.配置Nginx,加載私鑰,證書
修改nginx.conf,添加
include extra/443.conf;# 創建https配置文件
vim 443.conf 寫入[root@web01 extra]# cat 443.confserver {server_name _;listen 443 ssl;ssl_certificate /opt/nginx/key/server.crt;ssl_certificate_key /opt/nginx/key/server1024.key;charset utf-8;location / {root html;index index.html index.htm;
}
}
~# 修改80端口虛擬主機,進行請求轉發給443
}
server {listen 80;server_name www.chaoge.com;charset utf-8;rewrite ^(.*)$ https://$host$1 permanent;location / {root html;index index.html index.htm;}}
include extra/443.conf;
}# 檢測語法,重啟nginx
[root@web01 extra]# nginx -t
nginx: the configuration file /opt/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx-1.16.0//conf/nginx.conf test is successful
?