如何在 Ubuntu Linux 上設置端到端的 CloudFlare SSL 加密

為任何網站設置SSL是一項挑戰。網站訪客、瀏覽器和搜索引擎都會獎勵一個正確配置安全套接層(SSL)的網站。以前,這個過程涉及購買、安裝和配置一個SSL證書。但是,使用Cloudflare SSL,您只需點擊幾下就可以完成配置SSL的過程!

在本文中,您將學習如何通過Cloudflare配置您的網站以使用SSL加密。因此,請努力實現端到端加密的SSL連接!

先決條件

要按照本教程進行操作,需要滿足以下一些先決條件:

設置Cloudflare通用SSL:只是開始的一步

有幾種方法可以使用 Cloudflare 配置 SSL。通常,最快的方法是選擇 Universal SSL。為什麼呢?使用 Universal SSL,Cloudflare 會自動提供一個證書,然後所有通過 Cloudflare 傳送的流量都將使用該證書。

啟用 Universal SSL 後,Cloudflare 將對訪問者和搜索引擎提供有效的 SSL 證書。Cloudflare 也不需要配置服務器或網站以使用該證書—非常方便!

1. 打開網絡瀏覽器,登錄到 Cloudflare 控制台

2. 從帳戶域列表中選擇您的站點,如下所示。

Choose the site to change options for.

3. 現在,點擊 SSL/TLS 查看站點的加密選項。

The SSL/TLS Encryption mode page

4. 選擇 Flexible 選項以啟用 Universal SSL。一旦選擇,更改將立即生效。您的站點現在在瀏覽器和 Cloudflare 之間是加密的!

Enabling Universal SSL on Cloudflare

配置全端到端 SSL 加密

儘管 Universal SSL 是保護站點的一個不錯的選擇,但它使服務器和 Cloudflare 之間的流量不安全。幸運的是,有兩種加密模式可以加密從 Cloudflare 到服務器的流量,即完全和完全(嚴格)加密,每種模式主要有不同的證書安裝要求。

  • 完全 – 需要服務器上的證書,但這可以是自簽名證書。
  • 全面(嚴格)- 安裝的伺服器端證書必須是有效的證書。

讓我們來看看這些加密方式之間的區別以及如何設置它們。

使用自簽名證書設置完整的SSL/TLS加密

與通用SSL不同,完整的SSL/TLS加密需要您的網絡伺服器正確提供一個SSL證書,以加密從伺服器到Cloudflare的流量。有很多方法可以實現這一點,但本教程展示了在具有NGINX的Linux伺服器上的步驟。

生成自簽名證書

為了加密Cloudflare與您的源伺服器之間的連接,您需要一個SSL證書。由於完整的SSL/TLS加密模式不要求證書被完全信任,因此您可以使用自簽名證書快速運行。

1. 安全外殼(SSH)進入您的Linux網絡伺服器。

2. 通過運行下面的命令更改(cd)到標準的Ubuntu SSL目錄(/etc/ssl)。 cd /etc/ssl

cd /etc/ssl
Navigating to the /etc/ssl directory

3. 現在,使用openssl命令生成您網站的公鑰和私鑰。為此,運行下面的openssl命令。

此命令完成了一些事情:

  • 通過-x509參數請求(req)由X.509證書提供。
  • 當被NGINX引用時,使用-nodes參數允許NGINX在啟動時讀取證書。
  • 指定證書有效的天數
  • 使用-newkey選項創建一個新的公鑰和私鑰,並使用2048位的RSA加密(rsa:2048)。
  • 將私鑰保存到/etc/ssl/private/nginx-selfsigned.key,使用-keyout參數。
  • 將公鑰保存到/etc/ssl/certs/nginx-selfsigned.crt,使用-out參數。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

如果openssl返回一個無害的錯誤Can't load /root/.rnd into RNG,您需要在/etc/ssl/openssl.cnf文件中註釋掉#RANDFILE = $ENV::HOME/.rnd行。所有現代版本的openssl都會回退到使用系統/dev/urandom設備來獲取隨機熵數據,不需要特定文件來進行種子播種。

4. 成功運行該命令後,openssl將提示您提供一些信息。下面是本教程提供的所有值。

  • 國家名稱: US
  • 州或省名稱: 伊利諾伊州
  • 地區名稱: 布卢明顿
  • 組織名稱: Test Company, LLC
  • 組織單位名稱: <空白>
  • 通用名稱: test.adamlistek.me
  • 電子郵件地址: [email protected]
Generating a self-signed certificate

5. 最後,使用 test 命令驗證證書是否存在。如果 test 命令返回 (echo $?) 0,則文件存在如預期。您可以在下面的截圖中看到每個命令返回了一個 0 值。

test -f /etc/ssl/private/nginx-selfsigned.key; echo $?
 test -f /etc/ssl/certs/nginx-selfsigned.crt; echo $?
Verifying that the certificate files exist

配置 NGINX

現在證書已經生成並存儲在 /etc/ssl/certs/etc/ssl/private 位置,必須配置 NGINX 以應用該證書並提供站點內容。

NGINX 站點配置定義在 server 块中,通常包含在虛擬主機文件中。在下面的示例中,基本站點配置存儲在 test.adamlistek.me.conf 文件中並包含在主 nginx.conf 文件中。

1. 首先,使用您選擇的名稱創建一個新的虛擬主機文件,但對於此示例,將其命名為 test.adamlistek.me.conf,放在 /etc/nginx/vhosts.d 目錄下。然後將下面的內容複製到虛擬主機文件中並保存。

test.adamlistek.me 域名替換為您自己的域名,因為這僅用於演示目的。如果 /etc/nginx/vhosts.d 位置不存在,請運行 mkdir /etc/nginx/vhosts.d 創建目錄。

server {
   # 監聽端口80,支援IPv4和IPv6
   listen 80;
   listen [::]:80;
 server_name test.adamlistek.me;
 # 對帶有任何參數的請求執行301重定向到下面的SSL伺服器區塊
   return 301 https://test.adamlistek.me$request_uri;
 }
 server {
   # 監聽端口443,啟用IPv4和IPv6,啟用HTTP2(需要SSL)
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
 server_name test.adamlistek.me;
 # 公共和私有證書的位置
   ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
   ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
 # 要載入的Web檔案的位置,這是NGINX的默認位置
   root /usr/share/nginx/html;
 # 根域請求時提供的默認檔案
   index index.html;
 }

2. 確認您的主NGINX配置檔/etc/nginx/nginx.conf包含必要的include行,位於http區塊的末尾。

# 放置伺服器配置的位置
 …
 http {
     # 放置額外配置的位置# 包含虛擬主機
     include /etc/nginx/vhosts.d/*.conf;
 }

3. 如果您使用的是systemd,即Linux的現代系統和服務管理器,使用以下命令重新啟動NGINX。

service nginx restart

4. 回到Cloudflare,驗證自簽名證書是否有效。要做到這一點,禁用DNS記錄下的Proxy status的“orange-cloud”選項,如下所示。禁用“orange-cloud”選項將繞過Cloudflare,直接從Web伺服器提供請求。

Disabling Cloudflare proxying via Proxy Status.

5. 確保網站通過網頁瀏覽器返回新創建的自簽名憑證。這樣做將導致顯示如下的警告頁面。

Displaying the self-signed certificate error.

6. 最後,在 Cloudflare 上啟用完整的 TLS/SSL 加密。要做到這一點,重新啟用您之前禁用的 DNS 記錄上的“橙色雲”Cloudflare 代理狀態。然後,導航到 SSL/TLS 選項卡,並點擊下方顯示的 完整 单选按钮。

Enabling Full SSL/TLS encryption on Cloudflare.

生成用於全(嚴格)SSL/TLS 加密的源證書

完整加密模式不能保證由 Web 服務器提供的憑證具有實際有效的憑證鏈。因此,請改為非嚴格加密,Cloudflare 將接受服務器提供的任何憑證。

Cloudflare 提供生成免費 TLS 憑證以保護您的源服務器連接的功能。但是,使用 Cloudflare 提供的源憑證有兩個缺點。一個是您需要手動生成並安裝憑證。第二個是該憑證看起來像是自簽名的憑證,任何瀏覽器都不會信任,除了 Cloudflare 之外。

使用 Origin CA 創建憑證 API 端點可以自動生成憑證,但這超出了本教程的範圍。

1. 通過進入 SSL/TLS 選項卡 —> 源服務器,如下所示,並點擊 創建憑證 按鈕。

Navigating to the Origin Server page.

2. 如您所見,默認選項已設置為為該域生成一個有效期為15年的萬用證書—太棒了!所以保持默認選項,並通過點擊頁面右下角的創建按鈕來生成證書。

A wildcard certificate, shown as *.domain.com, means that any subdomain will also be covered by this certificate including www.

Creating a Cloudflare-provided origin server certificate.

3. 使用GNU nano文本編輯器首先保存私鑰和公鑰。由於有兩個密鑰需要保存,您需要一次保存一個密鑰文件。

請確保保存私鑰,因為它僅在生成原始證書時才可用。如果不慎丟失此密鑰,請撤銷證書並重新發行新的證書。

打開終端,然後運行下面的第一個命令來創建並打開公鑰文件(nginx-test.adamlistek.me.crt)。

接下來,返回到 Cloudflare,點擊點擊複製選項,複製(Ctrl+U)您從 Cloudflare 複製的原始證書鍵(公鑰)。然後將您從 Cloudflare 複製的公鑰粘貼到 nano 中打開的公鑰文件中。保存更改(Ctrl+O)並退出(Ctrl+X)nano。

保存公鑰文件後,重複從創建密鑰文件、從 Cloudfare 複製密鑰並將其保存到密鑰文件的過程。但是這次您將創建私鑰文件(nginx-test.adamlistek.me.key)。

# 在 Origin Certificate 部分下的公鑰
 nano /etc/ssl/certs/nginx-test.adamlistek.me.crt
# 在相同名稱的部分下的私鑰
 nano /etc/ssl/private/nginx-test.adamlistek.me.key
Copying the public/private certificate key information.

4. 現在您已經創建了公鑰和私鑰,將 NGINX 指向證書的位置。通過修改 test.adamlistek.me.conf 配置文件,添加下面的行,並修改以支援您的域名。

 ssl_certificate /etc/ssl/certs/nginx-test.adamlistek.me.crt;
 ssl_certificate_key /etc/ssl/private/nginx-test.adamlistek.me.key;

5. 要應用新證書,請使用以下命令重新啟動 NGINX。

service nginx restart

6. 現在返回到 Cloudflare 中的 SSL/TLS 選項卡,在下面看到的地方點擊 Full (strict) 以更新 SSL/TLS 加密模式。

Setting the Encryption mode to Full (strict).

啟用 LetsEncrypt 的全面 (strict) SSL/TLS 加密

使用 Cloudflare 原始證書的最大缺點是它僅限於 Cloudflare 所信任的證書。假設您需要一個完全由瀏覽器信任的證書,無論是作為後備還是進一步控制,LetsEncrypt 都提供了生成正確證書的能力。

儘管您可以使用任何有效的證書,但 LetsEncrypt 是生成有效證書的常見選擇。有多個 LetsEncrypt 客戶端可用,但本教程演示了 acme.sh 客戶端。

由於您已經在 Cloudflare 上,使用 DNS 選項進行 LetsEncrypt 的 DNS 配置是最佳方法之一。

1. 首先,打開您的終端,並通過 curl 命令安裝 acme.sh

curl https://get.acme.sh | sh
Installing the acme.sh client.

2. 接下來是在安裝目錄中創建或修改account.conf文件,以添加保存的 Cloudflare API 金鑰。這些金鑰可以在 Cloudflare 控制面板的個人資料 —> API 令牌部分中找到。

儘管您可以創建一個特定權限的令牌,但在本教程中,請使用全局 API 金鑰,如下所示。

SAVED_CF_Key='cloudflareglobalapikey'
 SAVED_CF_Email='[email protected]'

3. 通過以下命令生成證書。注意下面的命令告訴acme.sh客戶端使用 Cloudflare(dns_cf)來驗證(--dns)證書的所有權。然後將等待時間(--dnsslep)設置為在發放(--issue)證書之前等待 20 秒,以(-d)指定域名(test.adamlistek.me)。

命令完成後,您將看到可以找到證書、證書密鑰、中間 CA 證書和完整鏈證書的路徑。

acme.sh --issue --dns dns_cf --dnssleep 20 -d test.adamlistek.me
Generating the LetsEncrypt certificate.

4. 像之前一樣,修改 NGINX 站點配置以更改ssl_certificatessl_certificate_key的位置。確保將/home/user替換為您的acme.sh安裝位置。

ssl_certificate /home/user/.acme.sh/test.adamlistek.me/test.adamlistek.me.csr;
 ssl_certificate_key /home/user/.acme.sh/test.adamlistek.me/test.adamlistek.me.key;

5. 使用以下命令重新啟動 NGINX 以應用新的配置。

service nginx restart

6. 最後,通過轉到SSL/TLS選項卡,然後點擊完全(嚴格),更新 Cloudflare 的 SSL/TLS 加密模式。

Setting the Encryption mode to Full (strict).

結論

在本教程中,您已經學會了如何使用Cloudflare提供的各種SSL/TLS選項來保護您的網站。將LetsEncrypt添加到您的Cloudflare SSL配置中還可以添加一個靈活且由用戶管理的起源證書選項!

有了各種保護與訪問者之間連接的選項的知識,您將能夠通過Cloudflare SSL實現對您的服務器的完全安全連接。

Source:
https://adamtheautomator.com/cloudflare-ssl/