如何在 Ubuntu 20.04 上使用 Cloudflare 和 Nginx 托管网站

作者选择了 Electronic Frontier Foundation作为 Write for Donations计划的一部分接受捐款。

介绍

Cloudflare是一个服务,位于访问者和网站所有者的服务器之间,作为网站的反向代理服务器。

Nginx是一個受歡迎的網頁伺服器,負責在互聯網上一些最大的和流量最高的網站。

在本教程中,您将使用来自 Cloudflare 的 Origin CA 证书保护您的 Nginx 网站,然后配置 Nginx 以使用身份验证的拉动请求。使用此设置的优点是您可以从 Cloudflare 的 CDN 和快速 DNS 分辨率中受益,同时确保所有连接通过 Cloudflare。

前提条件

要完成本教程,您将需要以下内容:

步骤 1 – 生成原始 CA TLS 证书

Cloudflare Origin CA 允许您生成由 Cloudflare 签名的免费 TLS 证书,将其安装在您的 Nginx 服务器上。

要使用 Origin CA 生成证书,请在 Web 浏览器中登录您的 Cloudflare 帐户。 选择您想要保护的域名,然后导航到您的 Cloudflare 仪表板的 SSL/TLS 部分。 从那里,导航到 Origin Server 选项卡,然后单击 Create Certificate 按钮:

Create certificate option in the Cloudflare dashboard

请选择 ** 生成私钥和 CSR 与 Cloudflare** 的默认选项。

Origin CA GUI options

点击 Next,您将看到带有 原始证书私钥的对话框。您需要将原始证书和私钥从 Cloudflare 传输到您的服务器。

Dialog showing the origin certificate and private key

您将使用服务器上的 /etc/ssl 目录来保留原始证书和私钥文件. 文件夹已经存在于服务器上。

首先,复制浏览器中的对话框中显示的原产地证书的内容。

然后,在您的服务器上,在您喜欢的文本编辑器中打开 `/etc/ssl/cert.pem:

1sudo nano /etc/ssl/cert.pem

将证书内容粘贴到文件中,然后保存并退出编辑器. 如果您使用nano,请按Ctrl+X,然后在提示时按Y,然后输入。

然后回到您的浏览器并复制 私钥的内容. 打开文件 /etc/ssl/key.pem 进行编辑:

1sudo nano /etc/ssl/key.pem

将私钥粘贴到文件中,保存文件,然后离开编辑器。

<$>[注] 注: 有时,当您从Cloudflare仪表板复制证书和密钥并粘贴到服务器上的相关文件时,会插入空行。

<$>[警告] ** 警告:** Cloudflare 的原始 CA 证书仅由 Cloudflare 信任,因此只能由与 Cloudflare 积极连接的原始服务器使用。

现在您已将密钥和证书文件复制到您的服务器,您需要更新 Nginx 配置以使用它们。

步骤 2 — 在 Nginx 中安装起源 CA 证书

在上一节中,您使用Cloudflare的仪表板生成了原始证书和私钥,并将文件保存到您的服务器上。

首先,请确保 UFW 允许 HTTPS 流量. 启用Nginx Full,这将打开两个端口80 (HTTP) 和端口443 (HTTPS):

1sudo ufw allow 'Nginx Full'

现在重新加载 UFW:

1sudo ufw reload

最后,检查你的新规则是否允许和UFW是否活跃:

1sudo ufw status

你会看到这样的输出:

1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere
7Nginx Full ALLOW Anywhere
8OpenSSH (v6)               ALLOW Anywhere (v6)
9Nginx Full (v6)           ALLOW Anywhere (v6)

现在您已经准备好调整您的 Nginx 服务器块了。 Nginx 在安装过程中创建了默认服务器块,如果它仍然存在的话,请删除它,因为您已经为您的域配置了自定义服务器块:

1sudo rm /etc/nginx/sites-enabled/default

接下来,打开您的域的 Nginx 配置文件:

1sudo nano /etc/nginx/sites-available/your_domain

檔案應該是這樣的:

 1[label /etc/nginx/sites-available/your_domain]
 2server {
 3        listen 80;
 4        listen [::]:80;
 5
 6        root /var/www/your_domain/html;
 7        index index.html index.htm index.nginx-debian.html;
 8
 9        server_name your_domain www.your_domain;
10
11        location / {
12                try_files $uri $uri/ =404;
13        }
14}

您将更改 Nginx 配置文件以执行以下操作:

  • 倾听端口 80 并重定向所有请求使用 https
  • 倾听端口 443 并使用上一节添加的原始证书和私钥。

更改文件,以便它看起来如下:

 1[label /etc/nginx/sites-available/your_domain]
 2server {
 3    listen 80;
 4    listen [::]:80;
 5    server_name your_domain www.your_domain;
 6    return 302 https://$server_name$request_uri;
 7}
 8
 9server {
10
11    # SSL configuration
12
13    listen 443 ssl http2;
14    listen [::]:443 ssl http2;
15    ssl_certificate         /etc/ssl/cert.pem;
16    ssl_certificate_key     /etc/ssl/key.pem;
17
18    server_name your_domain www.your_domain;
19
20    root /var/www/your_domain/html;
21    index index.html index.htm index.nginx-debian.html;
22
23    location / {
24            try_files $uri $uri/ =404;
25    }
26}

保存文件并离开编辑器。

接下来,测试以确保您的任何 Nginx 配置文件中没有语法错误:

1sudo nginx -t

如果您没有发现任何问题,请重新启动 Nginx 以启用更改:

1sudo systemctl restart nginx

现在,进入Cloudflare仪表板的 SSL/TLS部分,导航到 Overview选项卡,并将 **SSL/TLS加密模式改为 Full(严格)

Enable Full(strict) SSL mode in the Cloudflare Dashboard

现在请访问您的网站在https://your_domain,以验证它是否正确设置,您将看到您的主页显示,浏览器将报告该网站是安全的。

Browser Certificate

在下一节中,您将设置 Authenticated Origin Pulls 来验证您的原始服务器确实在与 Cloudflare 交谈,而不是其他服务器。

步骤 3 – 设置身份验证的起源提取器

此步骤将使用 TLS 客户端身份验证来验证您的源 Nginx 服务器是否与 Cloudflare 交谈。

在客户端认证的TLS手动中,双方都提供一个证书来验证。原始服务器配置为仅接受使用Cloudflare有效客户端证书的请求。未通过Cloudflare的请求将被删除,因为它们将没有Cloudflare的证书。

Cloudflare 提供由 CA 签署的证书,具有以下证书:

 1-----BEGIN CERTIFICATE-----
 2MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
 3BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
 4aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
 5cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
 6MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
 7BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
 8VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
 9ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
10ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
1142tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
12ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
13hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
14QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
15Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
16aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
17lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
18PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
19CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
20+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
21AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
22DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
23alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
24QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
25zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
26VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
276BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
280O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
295ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
30fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
31bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
32iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
33AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
34fVQ6VpyjEXdiIXWUq/o=
35-----END CERTIFICATE-----

您也可以直接从 Cloudflare 的文档下载证书。

复制此证书。

然后创建文件 /etc/ssl/cloudflare.crt 以保留 Cloudflare 证书:

1sudo nano /etc/ssl/cloudflare.crt

将证书添加到文件中,然后保存文件并退出编辑器。

现在更新您的 Nginx 配置以使用 TLS Authenticated Origin Pulls. 打开您的域的配置文件:

1sudo nano /etc/nginx/sites-available/your_domain

添加ssl_client_certificatessl_verify_client指令,如下示例所示:

 1[label /etc/nginx/sites-available/your_domain]
 2. . .
 3
 4server {
 5
 6    # SSL configuration
 7
 8    listen 443 ssl http2;
 9    listen [::]:443 ssl http2;
10    ssl_certificate         /etc/ssl/cert.pem;
11    ssl_certificate_key     /etc/ssl/key.pem;
12    ssl_client_certificate /etc/ssl/cloudflare.crt;
13    ssl_verify_client on;
14
15    . . .

保存文件并离开编辑器。

接下来,测试 Nginx 以确保您的 Nginx 配置中没有语法错误:

1sudo nginx -t

如果没有发现任何问题,请重新启动 Nginx 以启用您的更改:

1sudo systemctl restart nginx

最后,要启用 Authenticated Pulls,请在 Cloudflare 仪表板中打开 SSL/TLS 部分,导航到 Origin Server 选项卡,然后切换 Authenticated Origin Pulls 选项。

Enable Authenticated Origin Pulls

现在,请访问您的网站在https://your_domain,以验证它是否正确设置。 如前所述,您将看到您的主页。

要验证您的服务器只接受 Cloudflare 的 CA 签署的请求,请切换 Authenticated Origin Pulls 选项以禁用它,然后重新加载您的网站。

Error message

如果 Cloudflare 的 CA 未签署请求,您的源服务器会引发错误。

<$>[注] **注:**大多数浏览器会缓存请求,所以要查看上述更改,您可以在浏览器中使用隐匿/私人浏览模式。为了防止Cloudflare在设置网站时缓存请求,请在Cloudflare仪表板中导航到 概览,然后转到 开发模式 <$>

现在你知道它正常工作了,回到 Cloudflare 仪表板中的 SSL/TLS 部分,导航到 Origin Server 卡,然后重新切换 Authenticated Origin Pulls 选项以启用它。

结论

在本教程中,您通过使用来自 Cloudflare 的 Origin CA 证书来加密 Cloudflare 和 Nginx 服务器之间的流量来保护您的 Nginx 驱动的网站,然后在 Nginx 服务器上设置 Authenticated Origin Pulls,以确保它只接受 Cloudflare 服务器的请求,防止任何人直接连接到 Nginx 服务器。

Published At
Categories with 技术
comments powered by Disqus