談談Nginx-HTTPS加密技術


    超文本傳輸安全協議(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 驗證是否啟動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM