Nginx HTTPS實(shí)現(xiàn)原理及配置實(shí)踐
1.HTTPS基本概述
1.1.為何需要HTTPS
因?yàn)镠TTP采用的是明文傳輸數(shù)據(jù),那么在傳輸(賬號密碼、交易信息等敏感數(shù)據(jù))時(shí)不安全。容易遭到篡改
如果使用HTTPS協(xié)議,數(shù)據(jù)在傳輸過程中是加密的,能夠有效避免網(wǎng)站傳輸時(shí)信息泄露
1.2.什么是HTTPS
HTTPS安全的超文本傳輸協(xié)議,我們現(xiàn)在大部分站點(diǎn)都是通過HTTPS來實(shí)現(xiàn)站點(diǎn)數(shù)據(jù)安全。
早期網(wǎng)景公司設(shè)計(jì)了SSL(Secure Socket Layer)安全套接層協(xié)議,主要對HTTP協(xié)議傳輸?shù)臄?shù)據(jù)進(jìn)行加密。那如何將站點(diǎn)變成安全的HTTPS站點(diǎn)呢?我們需要了解SSL(Secure Socket Layer)協(xié)議。
而現(xiàn)在很多時(shí)候我們使用的是TLS(Transport Layer Security)傳輸層安全協(xié)議來實(shí)現(xiàn)的加密與解密
1.3.TLS如何實(shí)現(xiàn)加密
TLS/SSL是如何實(shí)現(xiàn)HTTP明文消息被加密的,TLS/SSL工作在OSI七層模型中,應(yīng)用層與傳輸層之間。
1.提供數(shù)據(jù)安全:保證數(shù)據(jù)不會(huì)被泄露
2.提供數(shù)據(jù)的完整性:保證數(shù)據(jù)在傳輸過程中不會(huì)被篡改
3.對應(yīng)用層交給傳輸層的數(shù)據(jù)進(jìn)行加密與解密。
2.HTTPS實(shí)現(xiàn)原理
2.1.加密模型-對稱加密
對稱加密:兩個(gè)想通訊的人持有相同的秘鑰,進(jìn)行加密與解密。如下:
- bob將原始文檔通過秘鑰加密生成一個(gè)密文文檔。
- alice拿到這個(gè)密文文檔以后,它可以用這把秘鑰還原為原始的明文文檔。
對稱加密究竟是如何實(shí)現(xiàn)的,我們可以以RC4這樣一個(gè)對稱加密序列算法來看一下。
- 加密:秘鑰序列+明文=密文
- 解密:秘鑰序列+密文=明文
2.2.加密模型-非對稱加密
非對稱加密:它根據(jù)一個(gè)數(shù)學(xué)原理,創(chuàng)建一對秘鑰(公鑰和私鑰)公鑰加密,私鑰解密;
- 私鑰:私鑰自己使用,不對外開放。
- 公鑰:公鑰給大家使用,對外開放。
比如:alice有一對公鑰和私鑰,他可以將公鑰發(fā)布給任何人。假設(shè)Bob是其中一個(gè),當(dāng)Bob要傳遞一份加密文檔給alice,那么Bob就可以用alice的公鑰進(jìn)行加密,alice收到加密文檔后通過自己的私鑰進(jìn)行解密,獲取原始文檔。
注意:alice必須知道Bob就是Bob,也就是它收到的信息必須是Bob發(fā)來的,那么這個(gè)信任問題,在多方通訊的過程中,必須有一個(gè)公信機(jī)構(gòu)來驗(yàn)收雙方的身份,那么這個(gè)機(jī)構(gòu)就是CA機(jī)構(gòu)。
2.3.身份驗(yàn)證機(jī)構(gòu)-CA
通訊雙方是如何驗(yàn)證雙方的身份?
CA架構(gòu)是可信任組織架構(gòu),主要用來頒發(fā)證書及驗(yàn)證證書。那CA機(jī)構(gòu)又是如何申請和頒發(fā)證書的呢?
我們首先需要申請證書,需要進(jìn)行登記,登記我是誰,我是什么組織,我想做什么,到了登記機(jī)構(gòu)在通過CSR發(fā)給CA,CA中心通過后,CA中心會(huì)生成一對公鑰和私鑰,那么公鑰會(huì)在CA證書鏈中保存,公鑰和私鑰證書訂閱人拿到后,會(huì)將其部署的WEB服務(wù)器上。
1.當(dāng)瀏覽器訪問我們的https站點(diǎn)時(shí),它會(huì)去請求我們的證書
2.Nginx會(huì)將我們的公鑰證書回傳給瀏覽器
3.瀏覽器會(huì)去驗(yàn)證我們的證書是否是合法的、是否是有效的
4.CA機(jī)構(gòu)會(huì)將過期的證書放置在CRL服務(wù)器,那么CRL服務(wù)的驗(yàn)證效率是非常差的,所以CA又推出了OCSP響應(yīng)程序性能還不是很高。
5.Nginx會(huì)有一個(gè)OCSP的開頭,當(dāng)我們開啟后,Nginx會(huì)主動(dòng)上OCSP上查詢,這樣大量的客戶端直接從Nginx獲取,證書是否有效。
2.4.HTTPS通訊原理
HTTPS加密過程,HTTPS采用混合加密算法,即對稱加密、和非對稱加密
通信前準(zhǔn)備工作:申請域名對應(yīng)的證書,并將其部署在Nginx服務(wù)器中。
1)第一步客戶端向服務(wù)端發(fā)送Client Hello消息,這個(gè)消息里包含了一個(gè)客戶端生成的隨機(jī)數(shù)Random1、客戶端支持的加密套件和客戶端支持TLS協(xié)議版本等信息
2)服務(wù)端會(huì)向客戶端發(fā)送Server Hello消息,返回自己的公鑰證書,挑選一個(gè)合適的加密套件、另外還會(huì)生成一份隨機(jī)數(shù)Random2推送給客戶端。至此客戶端和服務(wù)端都擁有了兩個(gè)隨機(jī)數(shù)(Random1+Random2)
3)客戶端收到服務(wù)端傳來的公鑰證書后,先從CA驗(yàn)證該證書的合法性(CA公鑰去解密公鑰證書),驗(yàn)證通過后取出證書中的服務(wù)端公鑰,再生成一個(gè)隨機(jī)數(shù)Random3,再用服務(wù)端公鑰非對稱加密Random3.
4)服務(wù)端用自己的私鑰解出客戶端生成的Random3。至此,客戶端和服務(wù)端都擁有Random1+Random2+Random3,兩邊根據(jù)同樣的算法生成一份秘鑰,握手結(jié)束后的應(yīng)用層數(shù)據(jù)都是使用這個(gè)秘鑰進(jìn)行對稱加密。
3.HTTPS擴(kuò)展知識(shí)
3.1.HTTPS證書類型
3.2.HTTPS購買建議
保護(hù)1個(gè)域名 www.wzx.net
保護(hù)5個(gè)域名 www images cdn test m
通配符域名 *.wzx.net
3.3.HTTPS顏色標(biāo)識(shí)
Https不支持續(xù)費(fèi),證書到期需要重新申請新并進(jìn)行替換。
Https不支持三級域名解析,如test.m.wzx.net *.m.wzx.net
Https顯示綠色,說明整個(gè)網(wǎng)站的url都是https的,并且都是安全的
Https顯示黃色,說明網(wǎng)站代碼中有部分URL地址是Http不安全協(xié)議的
Https顯示紅色,要么證書是假的,要么證書已經(jīng)過期
4.HTTPS單臺(tái)配置實(shí)踐
4.1.配置SSL語法
#官方示例 worker_processes auto; http { ... server { listen 443 ssl; keepalive_timeout 70; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5; ssl_certificate /usr/local/nginx/conf/cert.pem; ssl_certificate_key /usr/local/nginx/conf/cert.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ... } }
4.2.創(chuàng)建SSL證書
1.創(chuàng)建證書存儲(chǔ)目錄
[root@nginx1 ~]# mkdir -p /etc/nginx/ssl_key [root@nginx1 ~]# cd /etc/nginx/ssl_key/
2.使用openssl命令充當(dāng)CA權(quán)威機(jī)構(gòu)創(chuàng)建證書(類似黑戶)
[root@nginx1 /etc/nginx/ssl_key]# openssl genrsa -idea -out server.key 2048 Generating RSA private key, 2048 bit long modulus .................................................................................................................................................................................................+++ .........................+++ e is 65537 (0x10001) #記住配置密碼,我這里是123456 Enter pass phrase for server.key: Verifying - Enter pass phrase for server.key:
3.生成自簽證書,同時(shí)去掉私鑰的密碼
[root@nginx1 /etc/nginx/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]:CN State or Province Name (full name) []:WH Locality Name (eg, city) [Default City]:WH Organization Name (eg, company) [Default Company Ltd]:hhhh Organizational Unit Name (eg, section) []:hhhh Common Name (eg, your name or your server's hostname) []:s.wzx.net Email Address []:wzx@qq.com #req --->用于創(chuàng)建新的證書 #new --->表示創(chuàng)建的是新證書 #x509 --->表示定義證書的格式為標(biāo)準(zhǔn)格式 #key --->表示調(diào)用的私鑰文件信息 #out --->表示輸出證書文件信息 #days --->表示證書的有效期 [root@nginx1 /etc/nginx/ssl_key]# ls server.crt server.key
4.3.配置SSL場景
[root@nginx1 /etc/nginx/conf.d]# vim s.wzx.net.conf server { listen 443 ssl; server_name s.wzx.net; ssl on; ssl_certificate /etc/nginx/ssl_key/server.crt; ssl_certificate_key ssl_key/server.key; location / { root /code4; index index.html; } } 準(zhǔn)備對應(yīng)的站點(diǎn)目錄,并重啟Nginx服務(wù) [root@nginx1 /etc/nginx/conf.d]# mkdir /code4 [root@nginx1 /etc/nginx/conf.d]# echo "https...." >/code4/index.html [root@nginx1 /etc/nginx/conf.d]# systemctl restart nginx
4.4.訪問驗(yàn)證SSL
瀏覽器輸入https://s.wzx.net訪問,由于該證書非第三方權(quán)威機(jī)構(gòu)頒發(fā),而是我們自己簽發(fā)的,所以瀏覽器會(huì)警告
4.5.強(qiáng)制跳轉(zhuǎn)Https
如果用戶忘記在瀏覽器地址欄輸入https://協(xié)議那么將不會(huì)跳轉(zhuǎn)至https站點(diǎn);
所以建議新增如下配置,將用戶訪問http請求強(qiáng)制跳轉(zhuǎn)https
[root@nginx1 /etc/nginx/conf.d]# vim s.wzx.net.conf server { listen 443 ssl; server_name s.wzx.net; ssl on; ssl_certificate /etc/nginx/ssl_key/server.crt; ssl_certificate_key ssl_key/server.key; location / { root /code4; index index.html; } } server { listen 80; server_name s.wzx.net; return 302 https://$server_name$request_uri; } [root@nginx1 /etc/nginx/conf.d]# systemctl restart nginx
5.HTTPS集群配置實(shí)踐
5.1.環(huán)境準(zhǔn)備
主機(jī)名 | IP | 主機(jī)名 |
---|---|---|
db-nfs | 192.168.146.176 | nginx-proxy |
nginx2 | 192.168.146.175 | nginx-web01 |
nginx1 | 192.168.146.101 | nginx-web02 |
5.2.配置應(yīng)用節(jié)點(diǎn)
#配置所有后端節(jié)點(diǎn),監(jiān)控80端口即可;
[root@nginx1 /etc/nginx/conf.d]# vim s.wzx.net.conf server { listen 80; server_name s.wzx.net; root /code/wordpress; location / { index index.html; } } root@nginx1 /etc/nginx/conf.d]# systemctl restart nginx
5.3.配置負(fù)載均衡
1.創(chuàng)建ssl證書
[root@db-nfs ~]# mkdir /etc/nginx/ssl_key -p [root@db-nfs ~]# cd /etc/nginx/ssl_key/ [root@db-nfs /etc/nginx/ssl_key]# openssl genrsa -idea -out server.key 2048 [root@db-nfs /etc/nginx/ssl_key]# openssl req -days 36500 -x509 -sha256 \ > -nodes -newkey rsa:2048 -keyout server.key -out server.crt
2.nginx負(fù)載均衡配置文件如下
[root@db-nfs /etc/nginx/ssl_key]# vim /etc/nginx/conf.d/proxy.conf upstream site { server 192.168.146.101:80 max_fails=2 fail_timeout=10s; server 192.168.146.175:80 max_fails=2 fail_timeout=10s; } server { listen 443; server_name s.oldxu.net; ssl on; ssl_certificate ssl_key/server.crt; ssl_certificate ssl_key/server.key; location / { proxy_pass http://site; include proxy_params; } } server { listen 80; server_name s.oldxu.net; return 302 https://$server_name$request_uri; }
6.HTTPS場景配置實(shí)踐
6.1.場景實(shí)踐-1
模擬銀行網(wǎng)站場景
1.用戶訪問網(wǎng)站主站,使用http協(xié)議提供訪問。
2.當(dāng)用戶點(diǎn)擊登陸時(shí),則網(wǎng)站會(huì)跳轉(zhuǎn)至一個(gè)新的域名,并使用的是https提供安全訪問。
1.主頁展示 http://yh.wzx.net(提供網(wǎng)頁瀏覽)
2.模擬登錄 http://yh.wzx.net/login (相當(dāng)于點(diǎn)擊了登錄的按鈕)
3.登錄頁面 http://star.oldxu.net (提供安全登錄)
1.配置http://star.wzx.net
[root@nginx1 ~]# vim /etc/nginx/conf.d/star.wzx.net.conf server { listen 443 ssl; server_name star.wzx.net; ssl_certificate ssl_key/server.crt; ssl_certificate_key ssl_key/server.key; root /code/login; location / { index index.html; } } [root@nginx1 ~]# mkdir /code/login [root@nginx1 /code/login]# echo "login......." > index.html [root@nginx1 /code/login]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@nginx1 /code/login]# systemctl restart nginx
2.配置http://yh.wzx.net(主頁頁面)
[root@nginx2 ~]# vim /etc/nginx/conf.d/yh.wzx.net.conf server { listen 80; server_name yh.wzx.net; root /code; location / { index index.html; } location /login { return 302 https://star.wzx.net; } } [root@nginx2 ~]# mkdir /code [root@nginx2 ~]# echo "yh" >/code/index.html [root@nginx2 ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@nginx2 ~]# systemctl restart nginx
6.2.場景實(shí)踐-2
需求:希望用戶訪問網(wǎng)站的所有url走h(yuǎn)ttps協(xié)議,但訪問s.wzx.net/abc時(shí)走h(yuǎn)ttp協(xié)議
[root@db-nfs /etc/nginx/conf.d]# cat proxy_agent.wzx.net.conf upstream webs { server 192.168.146.101:80; server 192.168.146.175:80; } server { listen 443 ssl; ssl_certificate ssl_key/server.crt; ssl_certificate ssl_key/server.key; server_name agent.wzx.net; location / { proxy_pass http://webs; include proxy_params; } } server { listen 80; server_name agent.wzx.net; if ($request_uri !~* "^/abc") { return 302 https://$http_host$request_uri; } location / { proxy_pass http://webs; include proxy_params; } }
7.HTTPS優(yōu)化配置實(shí)踐
7.1.優(yōu)化基本概述
SSL的運(yùn)行計(jì)算需要消耗額外的CPU資源,SSL通訊過程中【握手】階段的運(yùn)算最占用CPU資源,有如下幾個(gè)方面可以進(jìn)行調(diào)整與優(yōu)化。
1.設(shè)置worker進(jìn)程數(shù)設(shè)置為等于CPU處理器的核心數(shù)。worker_processes auto
2.啟用keepalive長連接,一個(gè)連接發(fā)送更多個(gè)請求
3.啟動(dòng)shared回話緩存,所有worker工作進(jìn)程之間共享的緩存,避免進(jìn)行多次SSL【握手】
4.禁用builtin內(nèi)置于的緩存,僅能供一個(gè)worker工作進(jìn)程使用,使用shared緩存即禁止builtin
7.2.優(yōu)化配置實(shí)例
worker_processes auto; http { ... server { listen 443 ssl; server_name www.example.com; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; #Nginx決定使用哪些協(xié)議與瀏覽器進(jìn)行通訊 keepalived_timeout 70; #設(shè)置長連接 #默認(rèn)不開啟session_cache: a握手后,關(guān)閉瀏覽器,再次訪問,需要重新握手; #建立握手后如果連接斷開,在session_timeout時(shí)間內(nèi)再次連接,無需再次建立握手,可直接復(fù)用之間緩存的連接 ssl_session_cache shared:SSL:10m; #1M緩存空間能存儲(chǔ)4000個(gè)會(huì)話數(shù)量; ssl_session_timeout 1440m; #配置會(huì)話超時(shí)時(shí)間(默認(rèn)5分鐘) } }
到此這篇關(guān)于Nginx HTTPS實(shí)現(xiàn)原理及配置實(shí)踐的文章就介紹到這了,更多相關(guān)Nginx HTTPS實(shí)現(xiàn)及配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Jenkins實(shí)現(xiàn)集群化管理以及流水線項(xiàng)目配置
這篇文章主要為大家介紹了Jenkins基本概念,配置實(shí)現(xiàn)集群化管理以及配置流水線項(xiàng)目的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Nginx如何設(shè)置域名轉(zhuǎn)發(fā)到服務(wù)器指定的端口
這篇文章主要介紹了Nginx如何設(shè)置域名轉(zhuǎn)發(fā)到服務(wù)器指定的端口,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Windows環(huán)境實(shí)現(xiàn)Nginx配置及開機(jī)自啟動(dòng)
本文主要介紹了Windows環(huán)境實(shí)現(xiàn)Nginx配置及開機(jī)自啟動(dòng),通過兩種方式可以實(shí)現(xiàn)nginx的開機(jī)自啟動(dòng),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03nginx 多個(gè)location轉(zhuǎn)發(fā)任意請求或訪問靜態(tài)資源文件的實(shí)現(xiàn)
這篇文章主要介紹了nginx 多個(gè)location轉(zhuǎn)發(fā)任意請求或訪問靜態(tài)資源文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11