超文本傳輸安全協議(HTTPS)是以安全為目標的HTTP通道,簡單來說就是HTTP安全版。https由兩個部分組成:HTTP+SSL/TLS,在http基礎上加上了一層加密信息模塊,服務端和客戶端的信息插損胡都會通過TLS進行加密,傳輸的數據都是加密后的數據
為了解決HTTP協議的這些缺陷,需要使用另一種協議:HTTPS。為了數據傳輸的安全性,HTTPS在http的基礎上加了SSL協議,SSL依靠證書驗證身份,並為瀏覽器和服務器之間通信加密;
SSL證書是一種數字證書,使用Secure Socket Layer協議在瀏覽器和web服務器之間建立一條安全通道,從而實現數據信息在客戶端和服務器之間的加密傳輸,保證雙方傳遞信息的安全性,不可被第三方竊聽,而且用戶可以通過服務器證書驗證所訪問網站是否真實可靠;
加密的HTTPS和HTTP的區別:超文本傳輸協議HTTP協議被用於在web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的加密數據,如果攻擊者截取了web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀取其中信息,因此,http協議不適合傳輸一些銘感信息;
HTTPS加密,解密,驗證完成過程如圖所示:
首先客戶端發送請求,服務端接受到請求之后並申請生成公私秘鑰,同時將公鑰證書發送給客戶端,客戶端收到之后並通過TLS進行解析驗證,如果證書沒有問題就會在客戶端生成一個加密隨機值,將隨機值發送給服務端,服務端接收到之后,用自己的私鑰解密,從而得到這個隨機值,然后通過這個隨機值對內容進行對稱加密。服務端將用私鑰加密后的信息發送給客戶端,最后,客戶端用之前生成的私鑰來解密服務器端發過來的信息,獲取解密后的內容
1)客戶端向服務端發起HTTPS請求,用戶在瀏覽器輸入https網址,然后連接到Nginx server的443端口
2)服務端采用https協議有一套數字證書,該證書可以自行配置,也可以向證書管理組織去申請,該證書其本質是公鑰和私鑰
3)將公鑰傳送給客戶端,證書包含了很多信息,例如,證書的頒發機構,過期時間等等
4)客戶端解析證書,由客戶端的TLS完成,首先會驗證公鑰是否有效,比如頒發的機構,過期時間等,如果發生異常,則會彈出警告信息,提示證書存在問題,如果證書沒有問題,就會隨機生成數值,然后用證書對該隨機數值進行加密
5)將證書加密后的隨機值傳送到服務器,讓服務器獲取該隨機值,后續客戶端和服務端可以通過該隨機值來進行加密解密
6)服務端用私鑰解密后,得到了客戶端傳過來的隨機值,然后把內容通過該值進行了對稱加密
7)服務端將私鑰加密后的信息發給客戶端
8)客戶端用之前生成的私鑰來解密服務端發送過來的信息,獲取解密后的內容
【證申請與頒發過程】
#可以通過openssl生成服務端的RSA秘鑰以及證書
[root@Nginx-web ~]# openssl genrsa -des3 -out server.key 1024
#創建簽名請求的證書CSR
[root@Nginx-web ~]# openssl req -new -key server.key -out server.csr
#加載SSL支持的Nginx並使用私鑰去除 口令
[root@Nginx-web ~]# cp server.key server.keybak
[root@Nginx-web ~]# openssl rsa -in server.keybak -out server.key
#自動簽發證書
[root@Nginx-web ~]# openssl x509 -req -days 10240 -in server.csr -signkey server.key -out server.crt
[root@Nginx-web ~]# yum install -y pcre-devel openssl-devel popt-devel
[root@Nginx-web ~]# useradd -M -s /sbin/nologin nginx
[root@Nginx-web ~]# tar zxvf nginx-1.11.2.tar.gz -C /usr/src/
[root@Nginx-web nginx-1.11.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
[root@Nginx-web nginx-1.11.2]# make
[root@Nginx-web nginx-1.11.2]# make install
[root@Nginx-web nginx-1.11.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
1 worker_processes 1; 2 events { 3 worker_connections 1024; 4 } 5 http { 6 include mime.types; 7 default_type application/octet-stream; 8 sendfile on; 9 keepalive_timeout 65; 10 server { 11 listen 80; 12 server_name localhost; 13 location / { 14 root html; 15 index index.html index.htm; 16 } 17 error_page 500 502 503 504 /50x.html; 18 location = /50x.html { 19 root html; 20 } 21 }
22 server {
23 listen 443 ssl; 24 server_name localhost; 25 ssl_certificate server.crt; 26 ssl_certificate_key server.key; 27 ssl_session_cache shared:SSL:1m; 28 ssl_session_timeout 5m; 29 ssl_ciphers HIGH:!aNULL:!MD5; 30 ssl_prefer_server_ciphers on; 31 location / { 32 root html; 33 index index.html index.htm; 34 } 35 } 36 }
如果僅僅是通過443端口訪問Nginx web網站的話,那么配置文件如下(那么這個時候,你默認輸入IP或者是域名是無法訪問的,只能前面加上https)
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 443 ssl; server_name localhost; ssl_certificate server.crt; ssl_certificate_key server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } }
PS:配置完成之后這里就會有一個坑,報一下這個錯,糾結了很久。。。其實當時看日志就可以知道,這是由於證書 的路徑 錯誤~,我們將其拷貝到nginx的conf下面即可
[root@Nginx-web ~]# cp server.crt server.key /usr/local/nginx/conf/
重啟Nginx-web服務,可通過netstat或者ps -ef 驗證是否啟動