Nginx 之https地址轉換
阿新 • • 發佈:2020-09-07
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