輕松配置 https:Let‘s Encrypt 介紹及 Nginx Proxy Manager 實用操作教程
前言
一般我們在本地進行 web 開發(fā)時用的都是 http 協(xié)議,而部署到服務(wù)器上之后為了安全都要配置 https,以保證客戶端和服務(wù)器之間的通信內(nèi)容得到加密,不會被泄露或篡改。
本文將介紹 https 協(xié)議的基本知識(如果有基礎(chǔ)可以跳過),以及如何使用 Let’s Encrypt 給你的服務(wù)優(yōu)雅地配置 https。
HTTPS
https本質(zhì)上還是http,只不過https使用了ssl協(xié)議來加密通信內(nèi)容。
ssl是一個介于TCP和應(yīng)用層的協(xié)議,基于非對稱加密算法,用于確保通信雙方的交流是私密的
對稱加密
加密解密使用同一把密鑰,但是如何安全地傳輸這個密鑰是個問題
非對稱加密
有三條原則:
- 私鑰加密,公鑰解密
- 公鑰加密,私鑰解密
- 公鑰加密,公鑰無法解密
服務(wù)端給客戶端發(fā)放公鑰,客戶端使用公鑰加密請求,只有服務(wù)端的私鑰能解密。服務(wù)端使用私鑰加密響應(yīng),客戶端使用公鑰解密。
看起來很美好,但這樣存在很一個很大的問題:如果有一個壞人(中間人)像下圖這樣操作,你們的通訊還是會被竊聽甚至篡改的。
問題的本質(zhì)在于:客戶端不知道自己拿到的公鑰是不是真實服務(wù)器的公鑰
CA證書
于是,引入了可信任的第三方權(quán)威機構(gòu)CA(Certificate Authority)
通過以上步驟可以保證客戶端拿到的一定是真實服務(wù)器的公鑰
混合加密
其實通過以上步驟已經(jīng)可以保證加密通信了, 但是非對稱加密的效率太低了, 而更高效的對稱加密卻不安全, 所以我們采用混合加密, 即使用非對稱加密傳輸對稱加密的密鑰, 雙方拿到對稱加密的密鑰之后使用對稱加密進行通信
以下步驟(即ssl握手)發(fā)生在TCP三次握手之后:
通過以上方式,雙方都擁有了相同的密鑰,而且這個密鑰是安全的,沒有被任何中間人獲取到。
聯(lián)想:抓包軟件
我們使用各種抓包軟件時(如Fiddler),會發(fā)現(xiàn)無法解析HTTPS的包,要想實現(xiàn)就必須要在系統(tǒng)中安裝它自己簽發(fā)的CA證書。
學(xué)完HTTPS后就可以理解了,F(xiàn)iddler相當于是你客戶端和服務(wù)器之間的一個代理,F(xiàn)iddler會經(jīng)手你和服務(wù)器之間所有的流量,所以Fiddler可以向你展示抓包內(nèi)容。
但是有了HTTPS之后,你和服務(wù)器使用的對稱加密密鑰只有你們兩個知道,F(xiàn)iddler就沒辦法解密通訊數(shù)據(jù)了。Fiddler要想解析就只能充當中間人,但是它的自簽發(fā)證書是不被OS信任的,所以你要手動信任該證書。
Let’s Encrypt
上文提到,要想使用 https 協(xié)議,服務(wù)端必須向 ca 機構(gòu)申請一個證書,這個證書是和域名綁定的,也就是說你必須要有一個域名,可以在阿里云等云服務(wù)提供商購買,也可以在 Freenom 免費申請一些小眾后綴的域名。
假設(shè)我們有一個域名叫 baizhukui.com ,指向了一臺服務(wù)器。我們想在這個服務(wù)器上運行一個 http 服務(wù)并配置 https,我們可以選擇在域名提供商購買并下載證書文件,然后將其手動安裝至服務(wù)器上。由于安裝過程比較繁瑣而且 ssl 證書是會過期的,所以我們更推薦另一種獲取 ssl 證書的方式:acme(Automated Certificate Management Environment)。
acme 是一個協(xié)議,旨在自動化網(wǎng)站或網(wǎng)絡(luò)應(yīng)用程序的證書簽發(fā)和管理過程。而 Let’s Encrypt 是一個證書頒發(fā)機構(gòu)(CA),它采用了 ACME 協(xié)議來實現(xiàn)證書的自動化獲取和更新。更重要的是,它是免費的!
我們一般開發(fā)的 web 應(yīng)用都是 http 協(xié)議的,https 這種和業(yè)務(wù)無關(guān)的事情一般都會交給網(wǎng)關(guān)/反向代理去做,例如 nginx,traefik,nginx proxy manager 等。他們負責流量的加密解密,然后把明文數(shù)據(jù)轉(zhuǎn)發(fā)給應(yīng)用去處理。
traefik 和 nginx proxy manager(下文簡稱 npm)都是支持 Let’s Encrypt 的,我們只要做必要的配置,他們就可以自動地獲取/更新/安裝 ssl 證書。npm 的功能簡單夠用,圖形化頁面又很直觀,所以我們就拿 npm 進行講解。
Nginx Proxy Manager
安裝
根據(jù) npm 官方推薦,使用 docker 部署。為了便于互聯(lián),你的 http 服務(wù)也要以 docker 容器的形式部署。
用docker network create npm
新建一個名為npm
的網(wǎng)絡(luò),這是為了讓網(wǎng)關(guān)和你的服務(wù)能夠使用容器名互相訪問,npm 和你的服務(wù)都需要加入此網(wǎng)絡(luò)。
~/.docker/app/npm/docker-compose.yml
version: '3'
services:
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80'
# gui端口
- '81:81'
- '443:443'
volumes:
- ./volume/data:/data
- ./volume/letsencrypt:/etc/letsencrypt
networks:
- npm
networks:
npm:
external: true
啟動后訪問服務(wù)器的 81 端口(記得開放端口),就可以看到 gui 頁面了
默認賬號:admin@example.com
默認密碼:changeme
登進去以后修改賬號密碼
反向代理并配置 https
點擊添加 proxy host
保存,你就可以使用 https://baizhukui.com 訪問你的服務(wù)了。
npm 的 ssl 配置中,dns challenge 是什么?為什么還要配 Credentials File Content?
ca 機構(gòu)簽發(fā)證書之前,必須檢驗?zāi)銓τ谶@個域名的所有權(quán),dns challenge 是檢驗方式的一種。共有以下幾種檢驗方式:
- DNS 驗證:通過給這個域名添加一條 dns 解析規(guī)則,然后去查看這個解析規(guī)則是否生效?!疤砑?dns 解析規(guī)則”要通過你的域名提供商api來實現(xiàn),比如訪問阿里云的 api 就需要提供你賬號的 access key 和 access secret。由于域名解析規(guī)則傳播需要一定時間,所以生效比較慢。
- HTTP 驗證:申請者在網(wǎng)站的特定路徑下放置包含特定密鑰或代碼的文件,證明對該域名的控制權(quán)。CA 發(fā)出驗證請求后會嘗試訪問該 URL 來檢查文件的存在性。npm 的默認驗證方式。簡單快速。
- TLS-SNI 驗證:申請者在服務(wù)器上配置特定的 TLS 證書,CA 發(fā)送驗證請求并檢查該證書以確認域名的控制權(quán)。
- Email 驗證:CA 發(fā)送驗證郵件到特定的注冊郵箱地址,申請者必須通過郵件中的鏈接或回復(fù)特定的驗證碼來證明對域名的控制權(quán)。
Basic Auth 鑒權(quán)
對于一些沒有提供鑒權(quán)手段但又要暴露在公網(wǎng)上的 http 服務(wù)(例如 loki)來說,“裸奔”總是令人內(nèi)心不安的。還好 npm 提供了 basic auth 功能,要求接口訪問者必須提供正確的賬號密碼。
這就是 access list 功能,我們可以添加一個。
保存,然后去proxy host 那里給對應(yīng)的服務(wù)添加這條鑒權(quán)規(guī)則。
然后客戶端在發(fā)起 http 請求時,要遵循以下規(guī)則:
- 客戶端請求訪問受保護的資源。
- 服務(wù)器返回 HTTP 狀態(tài)碼 401(未授權(quán)),并在響應(yīng)頭部的
WWW-Authenticate
字段中包含Basic
,表示使用基本認證。 - 客戶端收到 401 后,會重新發(fā)送請求,但這次在請求頭部中包含
Authorization
字段,其值為Basic
后接 base64 編碼的用戶名和密碼組合,格式為username:password
。
例如,如果用戶名是 user123
,密碼是 pass456
,則經(jīng)過 base64 編碼后的字符串為 dXNlcjEyMzpwYXNzNDU2
??蛻舳苏埱箢^部的 Authorization
字段將是 Basic dXNlcjEyMzpwYXNzNDU2
。
當然,許多使用場景都會提供現(xiàn)成的 basic auth 功能,你只需要輸入賬號和密碼就可以了。
注意,由于 basic auth 會明文傳輸你的賬號和密碼,所以必須配合 https 使用。否則就像裝了防盜門但是總把鑰匙掛在門上一樣。文章來源:http://www.zghlxwxcb.cn/news/detail-838385.html
由于鑒權(quán)是通過 npm 實現(xiàn)的,我們不能允許有繞過 npm 的機會,所以記得關(guān)掉受保護容器的端口映射,強制所有流量都走 npm。否則就像裝了防盜門但是旁邊又開著窗戶一樣。文章來源地址http://www.zghlxwxcb.cn/news/detail-838385.html
到了這里,關(guān)于輕松配置 https:Let‘s Encrypt 介紹及 Nginx Proxy Manager 實用操作教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!