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

作者选择了电子前沿基金会 作为Write for DOnations计划的一部分接受捐赠

介绍

Cloudflare是一种位于访问者和网站所有者服务器之间的服务,充当网站的反向代理。Cloudflare 提供内容交付网络 (CDN),以及 DDoS 缓解和分布式域名服务器服务。

Nginx是一种流行的 Web 服务器,负责托管 Internet 上一些最大和流量最高的站点。组织通常使用 Nginx 为网站提供服务,并将 Cloudflare 用作 CDN 和 DNS 提供商。

在本教程中,您将使用CloudflareOrigin CA 证书保护由 Nginx 提供服务的网站,然后将 Nginx 配置为使用经过身份验证的拉取请求。使用此设置的优势在于您可以从 Cloudflare 的 CDN 和快速 DNS 解析中受益,同时确保所有连接都通过 Cloudflare。这可以防止任何恶意请求到达您的服务器。

先决条件

要完成本教程,您需要具备以下条件:

步骤 1 — 生成 Origin CA TLS 证书

Cloudflare Origin CA 允许您生成由 Cloudflare 签名的免费 TLS 证书以安装在您的 Nginx 服务器上。通过使用 Cloudflare 生成的 TLS 证书,您可以保护 Cloudflare 的服务器和您的 Nginx 服务器之间的连接。

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

在 Cloudflare 仪表板中创建证书选项

保留默认选项让 Cloudflare 生成私钥并选择CSR

Origin CA GUI 选项

单击下一步,您将看到一个包含Origin CertificatePrivate key的对话框您需要将原始证书和私钥从 Cloudflare 传输到您的服务器。出于安全原因,私钥信息将不会再次显示,因此请在单击Ok之前将密钥复制到您的服务器

显示原始证书和私钥的对话框

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

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

然后,在您的服务器上,/etc/ssl/cert.pem在您首选的文本编辑器中打开

  • sudo nano /etc/ssl/cert.pem

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

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

  • sudo nano /etc/ssl/key.pem

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

注意:有时,当您从 Cloudflare 仪表板复制证书和密钥并将其粘贴到服务器上的相关文件时,会插入空行。Nginx 会将此类证书和密钥视为无效,因此请确保文件中没有空行。

警告: Cloudflare 的 Origin CA 证书仅受 Cloudflare 信任,因此只能由主动连接到 Cloudflare 的源服务器使用。如果您在任何时候暂停或禁用 Cloudflare,您的 Origin CA 证书将引发不受信任的证书错误。

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

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

在上一节中,您使用 Cloudflare 的仪表板生成了原始证书和私钥,并将文件保存到您的服务器。现在,您将更新站点的 Nginx 配置,以使用源证书和私钥来保护 Cloudflare 的服务器与您的服务器之间的连接。

首先,确保 UFW 将允许 HTTPS 流量。Enable Nginx Full,这将打开端口80(HTTP) 和端口443(HTTPS):

  • sudo ufw allow 'Nginx Full'

现在重新加载UFW:

  • sudo ufw reload

最后,检查您的新规则是否被允许以及 UFW 是否处于活动状态:

  • sudo ufw status

你会看到这样的输出:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

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

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

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

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

该文件应如下所示:

/etc/nginx/sites-available/your_domain
server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

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

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

修改文件,使其看起来如下所示:

/etc/nginx/sites-available/your_domain
server {
    listen 80;
    listen [::]:80;
    server_name your_domain www.your_domain;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL configuration

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;

    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;
    index index.html index.htm index.nginx-debian.html;


    location / {
            try_files $uri $uri/ =404;
    }
}

保存文件并退出编辑器。

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

  • sudo nginx -t

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

  • sudo systemctl restart nginx

现在转到 Cloudflare 仪表板的SSL/TLS部分,导航到概览选项卡,并将SSL/TLS 加密模式更改Full (strict)这会通知 Cloudflare 始终加密 Cloudflare 和您的源 Nginx 服务器之间的连接。

在 Cloudflare 仪表板中启用完整(严格)SSL 模式

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

在下一部分中,您将设置 Authenticated Origin Pulls 以验证您的源服务器确实在与 Cloudflare 而不是某个其他服务器进行通信。通过这样做,Nginx 将被配置为仅接受使用来自 Cloudflare 的有效客户端证书的请求;所有未通过 Cloudflare 的请求都将被丢弃。

第 3 步 – 设置经过身份验证的源拉取

Origin CA 证书将帮助 Cloudflare 验证它是否正在与正确的源服务器通信。此步骤将使用 TLS 客户端身份验证来验证您的源 Nginx 服务器是否正在与 Cloudflare 通信。

在客户端验证的 TLS 握手中,双方都提供要验证的证书。源服务器配置为仅接受使用来自 Cloudflare 的有效客户端证书的请求。未通过 Cloudflare 的请求将被丢弃,因为它们没有 Cloudflare 的证书。这意味着攻击者无法绕过 Cloudflare 的安全措施并直接连接到您的 Nginx 服务器。

Cloudflare 使用以下证书提供由 CA 签署的证书:

-----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 的证书:

  • sudo nano /etc/ssl/cloudflare.crt

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

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

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

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

/etc/nginx/sites-available/your_domain
. . .

server {

    # SSL configuration

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;
    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    . . .

保存文件并退出编辑器。

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

  • sudo nginx -t

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

  • sudo systemctl restart nginx

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

启用经过身份验证的源拉取

现在访问您的网站以验证它是否已正确设置。和以前一样,您将看到您的主页显示出来。https://your_domain

要验证您的服务器是否仅接受由 Cloudflare 的 CA 签名的请求,请切换Authenticated Origin Pulls选项以禁用它,然后重新加载您的网站。您应该收到以下错误消息:

错误信息

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

注意:大多数浏览器都会缓存请求,因此要查看上述更改,您可以在浏览器中使用隐身/私密浏览模式。要防止 Cloudflare 在您设置网站时缓存请求,请导航到Cloudflare 仪表板中的概览并切换开发模式

现在您知道它可以正常工作,返回Cloudflare 仪表板中SSL/TLS部分,导航到Origin Server选项卡并再次切换Authenticated Origin Pulls选项以启用它。

结论

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁