如何在Ubuntu18.04上使用Cloudflare和Nginx托管网站

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Electronic Frontier Foundation 来接受捐赠。

介绍

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

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

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

先决条件

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

第 1 步 — 生成 Origin CA TLS 证书

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

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

保留默认选项 Let Cloudflare generate a private key 并选中 CSR

单击 Next,您将看到一个对话框,其中包含 Origin CertificatePrivate key。 您需要将原始证书和私钥从 Cloudflare 传输到您的服务器。 为安全起见,Private Key信息将不再显示,请在点击Ok之前将密钥复制到您的服务器。

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

首先,复制浏览器对话框中显示的Origin Certificate的内容。

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

sudo nano /etc/ssl/cert.pem

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

然后返回浏览器并复制私钥的内容。 打开文件/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 证书

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

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

sudo ufw allow 'Nginx Full'

现在重新加载 UFW:

sudo ufw reload

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

sudo ufw status

你会看到这样的输出:

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 在安装过程中会创建一个默认的服务器块。 如果它仍然存在,请删除它,因为您已经为您的域配置了自定义服务器块:

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        on;
    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 部分,导航到 Overview 选项卡,然后将 SSL/TLS 加密模式 更改为 Full(严格) 。 这会通知 Cloudflare 始终加密 Cloudflare 和您的原始 Nginx 服务器之间的连接。

现在访问您的网站 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 here 下载证书。

复制此证书。

然后创建文件 /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        on;
    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 配置中没有语法错误:

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 仪表板中的 Overview 并切换 Development Mode


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

结论

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