1. 程式人生 > 實用技巧 >Nginx 之https地址轉換

Nginx 之https地址轉換

一、HTTPS介紹

1.概述

為什麼需要使用HTTPS,因為HTTP不安全,當我們使用http網站時,會遭到劫持和篡改,如果採用https協議,那麼資料在傳輸過程中是加密的,所以黑客無法竊取或者篡改資料報文資訊,同時也避免網站傳輸時資訊洩露。

那麼我們在實現https時,需要了解ssl協議,但我們現在使用的更多的是TLS加密協議。

那麼TLS是怎麼保證明文訊息被加密的呢?在OSI七層模型中,應用層是http協議,那麼在應用層協議之下,我們的表示層,是ssl協議所發揮作用的一層,他通過(握手、交換祕鑰、告警、加密)等方式,是應用層http協議沒有感知的情況下做到了資料的安全加密

2.模擬網站篡改

1)配置一個網站

[root@web01 /code]# vim /etc/nginx/conf.d/linux.jiechi.com.conf
server {
    listen 80;
    server_name linux.jiechi.com;
    charset utf-8;
​
    location / {
        root /code/jc;
        index index.html;
    }
} 

2)寫一個網站頁面

[root@web01 /code]# mkdir /code/jc
[root@web01 /code]# cat /code/jc/index.html 
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>我是title</title> </head> <body> <article> <header> <h1>我是qiudao</h1> <p>建立時間:<time pubdate="pubdate">2018/8/10</time></p> </header> <p> <b>Aticle</b>第一次用h5寫文章,好他*的緊張...
</p> <footer> <p><small>版權所有!</small></p> </footer> </article> </body> </html>

3)重啟nginx訪問

[root@web01 /code]# systemctl restart nginx
#配置hosts
10.0.0.7 linux.jiechi.com

4)配置劫持網站的網站

[root@lb01 ~]# vim /etc/nginx/conf.d/linux.jiechi.com.conf
server {
    listen 80;
    server_name linux.jiechi.com;
    charset utf-8;
​
    location / {
        #劫持
        proxy_pass http://10.0.0.7;
        include proxy_params;
        #篡改
        sub_filter '<title>我是title</title>' '<title>我不是個東西</title>';
        sub_filter '<b>qiudao</b>第一次用h5寫文章,好他*的緊張...' '<img src="https://blog.driverzeng.com/zenglaoshi/xingganheguan.gif">';
    }
}

5)配置hosts訪問

[root@lb01 /code]# systemctl restart nginx
#配置hosts
#10.0.0.7 linux.jiechi.com
10.0.0.4 linux.jiechi.com

3.HTTPS證書下發流程

我們首先需要申請證書,先去登記機構進行身份登記,我是誰,我是幹嘛的,我想做什麼,然後登記機構再通過CSR發給CA,CA中心通過後會生成一堆公鑰和私鑰,公鑰會在CA證書鏈中儲存,公鑰和私鑰證書我們拿到後,會將其部署在WEB伺服器上

1.當瀏覽器訪問我們的https站點時,他會去請求我們的證書
2.Nginx這樣的web伺服器會將我們的公鑰證書發給瀏覽器
3.瀏覽器會去驗證我們的證書是否合法有效
4.CA機構會將過期的證書放置在CRL伺服器,CRL服務的驗證效率是非常差的,所以CA有推出了OCSP響應程式,OCSP響應程式可以查詢指定的一個證書是否過去,所以瀏覽器可以直接查詢OSCP響應程式,但OSCP響應程式效能還不是很高
5.Nginx會有一個OCSP的開關,當我們開啟後,Nginx會主動上OCSP上查詢,這樣大量的客戶端直接從Nginx獲取證書是否有效
#不用記
1、瀏覽器發起往伺服器的443埠發起請求,請求攜帶了瀏覽器支援的加密演算法和雜湊演算法。
2、伺服器收到請求,選擇瀏覽器支援的加密演算法和雜湊演算法。
3、伺服器下將數字證書返回給瀏覽器,這裡的數字證書可以是向某個可靠機構申請的,也可以是自制的。
4、瀏覽器進入數字證書認證環節,這一部分是瀏覽器內建的TLS完成的:
4.1 首先瀏覽器會從內建的證書列表中索引,找到伺服器下發證書對應的機構,如果沒有找到,此時就會提示使用者該證書是不是由權威機構頒發,是不可信任的。如果查到了對應的機構,則取出該機構頒發的公鑰。
4.2 用機構的證書公鑰解密得到證書的內容和證書籤名,內容包括網站的網址、網站的公鑰、證書的有效期等。瀏覽器會先驗證證書籤名的合法性(驗證過程類似上面Bob和Susan的通訊)。簽名通過後,瀏覽器驗證證書記錄的網址是否和當前網址是一致的,不一致會提示使用者。如果網址一致會檢查證書有效期,證書過期了也會提示使用者。這些都通過認證時,瀏覽器就可以安全使用證書中的網站公鑰了。
4.3 瀏覽器生成一個隨機數R,並使用網站公鑰對R進行加密。
5、瀏覽器將加密的R傳送給伺服器。
6、伺服器用自己的私鑰解密得到R。
7、伺服器以R為金鑰使用了對稱加密演算法加密網頁內容並傳輸給瀏覽器。
8、瀏覽器以R為金鑰使用之前約定好的解密演算法獲取網頁內容。

4.證書型別介紹

對比域名型 DV企業型 OV增強型 EV
綠色位址列 小鎖標記+https 小鎖標記+https 小鎖標記+企業名稱+https
一般用途 個人站點和應用; 簡單的https加密需求 電子商務站點和應用; 中小型企業站點 大型金融平臺; 大型企業和政府機構站點
稽核內容 域名所有權驗證 全面的企業身份驗證; 域名所有權驗證 最高等級的企業身份驗證; 域名所有權驗證
頒發時長 10分鐘-24小時 3-5個工作日 5-7個工作日
單次申請年限 1年 1-2年 1-2年
賠付保障金 —— 125-175萬美金 150-175萬美金

5.證書購買選擇

1.單個域名    www.mumusir.com
2.保護多個域名 www. class. test. cdn. all.
3.萬用字元域名

6.HTTPS證書注意事項

1.https證書不支援續費,證書到期需要重新申請並進行替換
2.https不支援三級域名解析,如 test.mall.mumsir.com
3.https顯示綠色,說明整個網站的url都是https的
4.https顯示黃色,因為網站程式碼中包含http的不安全連結
5.https顯示紅色,那麼證書是假的或者證書過期。

二、單臺機器HTTPS配置

1.檢查nginx

[root@web01 /code]# nginx -v
nginx version: nginx/1.18.0
[root@web01 /code]# nginx -V
--with-http_ssl_module

2.建立存放證書的目錄

[root@web01 /code]# mkdir /etc/nginx/ssl_key
[root@web01 /code]# cd /etc/nginx/ssl_key/

3.生成證書

#使用openssl命令充當CA權威機構建立證書(生產不使用此方式生成證書,不被網際網路認可的黑戶證書)
[root@web01 /etc/nginx/ssl_key]# openssl genrsa -idea -out server.key 2048
Generating RSA private key, 2048 bit long modulus
....+++
..................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key: 123456
Verifying - Enter pass phrase for server.key: 123456#生成自簽證書,同時去掉私鑰的密碼
[root@web03 ssl_key]# openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
Generating a 2048 bit RSA private key
..................................................................................................+++
...................................................................................................+++
writing new private key to 'server.key'
-----
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]:zhongguo
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [XX]:CN   
State or Province Name (full name) []:meiguo
Locality Name (eg, city) [Default City]:riben
Organization Name (eg, company) [Default Company Ltd]:heiyiren
Organizational Unit Name (eg, section) []:heiyiren
Common Name (eg, your name or your server's hostname) []:kenan
Email Address []:123@qq.com
​
# req  --> 用於建立新的證書
# new  --> 表示建立的是新證書    
# x509 --> 表示定義證書的格式為標準格式
# key  --> 表示呼叫的私鑰檔案資訊
# out  --> 表示輸出證書檔案資訊
# days --> 表示證書的有效期
#證書生成後兩個檔案
[root@web01 /etc/nginx/ssl_key]# ll
total 8
-rw-r--r-- 1 root root 1387 Sep  4 11:30 server.crt
-rw-r--r-- 1 root root 1704 Sep  4 11:30 server.key

4.證書配置語法

#開啟ssl認證
Syntax: ssl on | off;
Default:    ssl off;
Context:    http, server
​
#指定證書檔案
Syntax: ssl_certificate file;
Default:    —
Context:    http, server
​
#指定私鑰檔案
Syntax: ssl_certificate_key file;
Default:    —
Context:    http, server

5.配置nginx證書

[root@web01 ~]# vim /etc/nginx/conf.d/linux.ssl.com.conf
server {
    listen 443 ssl;
    server_name linux.ssl.com;
    ssl_certificate /etc/nginx/ssl_key/server.crt;
    ssl_certificate_key /etc/nginx/ssl_key/server.key;
​
    location / {
        root /code/ssl;
        index index.html;
    }
}

6.重啟訪問

[root@web01 ~]# systemctl restart nginx
#配置hosts
10.0.0.7 linux.ssl.com

7.HTTP自動跳轉HTTPS

[root@web01 ~]# vim /etc/nginx/conf.d/linux.ssl.com.conf
server {
    listen 443 ssl;
    server_name linux.ssl.com;
    ssl_certificate /etc/nginx/ssl_key/server.crt;
    ssl_certificate_key /etc/nginx/ssl_key/server.key;
​
    location / {
        root /code/ssl;
        index index.html;
    }
}
​
server {
    listen 80;
    server_name linux.ssl.com;
    rewrite (.*) https://linux.ssl.com$1;
    #return 302 https://$server_name$request_uri;
}

三、全站HTTPS

1.環境準備

主機外網IP內網IP身份
lb01 10.0.0.4 172.16.1.4 負載均衡
web01 172.16.1.7 web伺服器
web03 172.16.1.9 web伺服器

2.配置web伺服器

1)配置nginx

[root@web01 ~]# vim /etc/nginx/conf.d/linux.https.com.conf
server {
    listen 80;
    server_name linux.https.com;
​
    location / {
        root /code/https;
        index index.html;
    }   
}

2)配置站點

[root@web01 ~]# mkdir /code/https
[root@web01 ~]# echo "web01111111" > /code/https/index.html
​
[root@web03 ~]# mkdir /code/https
[root@web03 ~]# echo "web033333333" > /code/https/index.html

3)測試訪問

[root@web01 ~]# systemctl restart nginx
[root@web03 ~]# systemctl restart nginx
#配置hosts訪問

3.配置負載均衡伺服器

1)配置證書

[root@web01 ~]# scp -r /etc/nginx/ssl_key 172.16.1.4:/etc/nginx/

2)配置nginx

[root@lb01 ~]# vim /etc/nginx/conf.d/linux.https.com.conf
upstream https_web {
    server 172.16.1.7:80;
    server 172.16.1.9;
}
​
server {
    listen 80;
    server_name linux.https.com;
    rewrite (.*) https://linux.https.com$1;
}
​
server {
    listen 443 ssl;
    server_name linux.https.com;
    ssl_certificate /etc/nginx/ssl_key/server.crt;
    ssl_certificate_key /etc/nginx/ssl_key/server.key;
    
    location / {
        proxy_pass http://https_web;
        include proxy_params;
    }
}

3)重啟訪問

[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# systemctl restart nginx
#配置hosts