介紹
Cloudflare是一項服務,位於訪問者與網站所有者的伺服器之間,充當網站的反向代理。Cloudflare提供內容交付網絡(CDN),以及防止分佈式阻斷服務(DDoS)攻擊和分佈式域名系統服務。
Nginx是一個流行的網絡伺服器,負責托管一些互聯網上最大和流量最高的網站。組織通常使用Nginx來提供網站並使用Cloudflare作為CDN和DNS提供者。
在本教程中,您將使用來自Cloudflare的Origin CA證書保護由Nginx提供的您的網站,然後配置Nginx使用驗證的拉取請求。使用此設置的優點是您可以從Cloudflare的CDN和快速DNS解析中受益,同時確保所有連接都通過Cloudflare。這可以防止任何惡意請求到達您的伺服器。
先決條件
要完成這個教程,您需要以下東西:
- 一個Ubuntu 22.04伺服器,按照Ubuntu 22.04初始伺服器設置指南設置,包括一個
sudo
非根用戶和一個防火牆。 - 在您的伺服器上安裝Nginx。您可以按照我們在Ubuntu 22.04上安裝Nginx的指南進行操作。
- A Cloudflare account.
- A registered domain added to your Cloudflare account that points to your Nginx server. Our guide on how to mitigate DDoS attacks against your website with Cloudflare can help you set this up. Our introduction to DNS terminology, components, and concepts can also provide assistance.
- 為您的域名配置Nginx服務器塊,您可以按照如何在Ubuntu 22.04上安裝Nginx的第5步進行操作。
步驟1 — 生成來源CA TLS證書
Cloudflare Origin CA允許您生成由Cloudflare簽署的免費TLS證書,以安裝在您的Nginx伺服器上。通過使用Cloudflare生成的TLS證書,您可以加密Cloudflare伺服器與您的Nginx伺服器之間的連接。
使用 Origin CA 生成证书,请在网页浏览器中登录到您的 Cloudflare 帐户。选择您要保护的域并导航到 Cloudflare 仪表板的 SSL/TLS 部分。从那里,导航到 源服务器 选项卡,然后点击 创建证书 按钮:
保留默认选项 使用 Cloudflare 生成私钥和CSR。
点击 创建,您将会看到一个对话框,显示 源证书 和 私钥。您需要将 Cloudflare 的源证书和私钥都传输到您的服务器上。出于安全原因,私钥 信息不会再次显示,因此在点击 确定 之前,请将私钥复制到您的服务器上。
您将使用服务器上的 /etc/ssl
目录来保存源证书和私钥文件。该文件夹已经存在于服务器上。
首先,在浏览器中复制对话框中显示的 源证书 的内容。
然后,在您的服务器上,使用您喜欢的文本编辑器打开 /etc/ssl/cert.pem
:
将证书内容粘贴到文件中。然后保存并退出编辑器。如果您使用的是 nano
,请按 Ctrl+X
,然后在提示时按 Y
,然后按 Enter。
然后返回浏览器,复制 私钥 的内容。打开文件 /etc/ssl/key.pem
进行编辑:
将私钥粘贴到文件中,保存文件,并退出编辑器。
注意:有时,当您从Cloudflare仪表板复制证书和密钥并将其粘贴到服务器上的相关文件时,会插入空行。Nginx会将这样的证书和密钥视为无效,请确保您的文件中没有空行。
警告:Cloudflare的源CA证书仅受Cloudflare信任,因此应仅由主机服务器使用,这些服务器当前已与Cloudflare连接。如果您随时暂停或禁用Cloudflare,则您的源CA证书将引发不受信任的证书错误。
现在您已将密钥和证书文件复制到服务器上,您需要更新Nginx配置以使用它们。
步骤2 — 在Nginx中安装源CA证书
在前一部分中,您使用Cloudflare的仪表板生成了一个源证书和私钥,并将文件保存到服务器上。现在,您将更新站点的Nginx配置,以使用源证书和私钥来保护Cloudflare服务器与您服务器之间的连接。
首先,请确保UFW允许HTTPS流量。启用Nginx Full
,这将打开端口80
(HTTP)和端口443
(HTTPS):
现在重新加载UFW:
最后,请检查您的新规则是否被允许,并且UFW是否处于活动状态:
你將會看到這樣的輸出:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
現在你已經準備好調整你的Nginx服務器塊了。Nginx在安裝期間會創建一個默認的服務器塊。如果它仍然存在,請刪除它,因為你已經為你的域名配置了自定義的服務器塊:
接下來,打開你的域名的Nginx配置文件:
文件應該看起來像這樣:
你將修改Nginx配置文件來執行以下操作:
- 監聽端口
80
並將所有請求重定向到使用https
。 - 監聽端口
443
並使用前一節中添加的原始證書和私鑰。
修改文件,使其看起來像下面這樣:
保存文件並退出編輯器。
接下來,測試以確保Nginx配置文件中沒有語法錯誤:
如果沒有發現問題,重新啟動Nginx以啟用你的更改:
現在轉到Cloudflare儀表板的SSL/TLS部分,進入概述選項卡,並將SSL/TLS加密模式更改為完全(嚴格)。這將通知Cloudflare始終加密Cloudflare與你的源Nginx服務器之間的連接。
現在訪問你的網站:https://your_domain
以驗證它是否設置正確。你將看到你的首頁,瀏覽器將報告該站點是安全的。
要查看證書的詳細資訊,請訪問您的瀏覽器的開發者工具,選擇安全選項卡,然後點擊查看證書。
注意:您可能會注意到您的證書未將Cloudflare列為發行者。這是因為Cloudflare可能使用其他證書授權機構,如Let’s Encrypt。要查看完整列表,請參閱Cloudflare的證書授權機構產品文檔。
在下一節中,您將設置驗證來源拉取以驗證您的源服務器是否確實與Cloudflare通信,而不是其他服務器。通過這樣做,Nginx將被配置為僅接受使用來自Cloudflare的有效客戶端證書的請求;所有未通過Cloudflare的請求將被拒絕。
步驟3 — 設置驗證來源拉取
來源CA證書將幫助Cloudflare驗證它正在與正確的源服務器通信。此步驟將使用TLS客戶端驗證來驗證您的源Nginx服務器是否與Cloudflare通信。
在客戶端認證的 TLS 握手中,雙方都提供要驗證的證書。源服務器被配置為僅接受使用來自 Cloudflare 的有效客戶端證書的請求。未通過 Cloudflare 的請求將被拒絕,因為它們沒有 Cloudflare 的證書。這意味著攻擊者無法規避 Cloudflare 的安全措施並直接連接到您的 Nginx 服務器。
Cloudflare 提供由以下證書簽署的證書:
-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----
您還可以直接從 Cloudflare 文檔下載證書。
複製這個證書。
然後創建文件 /etc/ssl/cloudflare.crt
來保存 Cloudflare 的證書:
將證書添加到文件中。然後保存文件並退出編輯器。
現在更新您的 Nginx 配置以使用 TLS 認證的來源拉取。打開您域名的配置文件:
按照以下示例添加 ssl_client_certificate
和 ssl_verify_client
指令:
保存文件並退出編輯器。
接下來,測試 Nginx,確保您的 Nginx 配置中沒有語法錯誤:
如果沒有發現問題,重新啟動 Nginx 以啟用您的更改:
最後,為了啟用身份驗證拉取,打開Cloudflare儀表板中的SSL/TLS部分,導航至源伺服器選項卡,並切換身份驗證源拉取選項。
現在,訪問您的網站:https://your_domain
,以驗證設置是否正確。與之前一樣,您將看到顯示您首頁的頁面。
為了驗證您的伺服器只接受Cloudflare的CA簽署的請求,將身份驗證源拉取選項切換為停用,然後重新加載您的網站。您應該會收到以下錯誤訊息:
如果Cloudflare的CA未對請求進行簽署,則您的源伺服器會引發錯誤。
注意:大多數瀏覽器將緩存請求,因此要查看上述更改,您可以在瀏覽器中使用無痕/私密瀏覽模式。為了在設置網站時防止Cloudflare緩存請求,請在Cloudflare儀表板中導航至概觀並切換開發模式。
現在您知道它正常工作,請返回Cloudflare儀表板中的SSL/TLS部分,導航至源伺服器選項卡,並再次切換身份驗證源拉取選項以啟用它。
結論
在這個教程中,您通過使用來自 Cloudflare 的 Origin CA 證書加密 Cloudflare 和 Nginx 伺服器之間的流量,為您的 Nginx 動力網站增強了安全性。然後,您在 Nginx 伺服器上設置了驗證來源拉取,以確保它僅接受來自 Cloudflare 伺服器的請求,從而防止其他任何人直接連接到 Nginx 伺服器。