圈小蛙

如何在Linux主机上使用Cloudflare和Nginx配置托管网站

前置介绍

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

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

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

前提条件

配置一台Linux服务器,Nginx安装在您的服务器上。
在您的Cloudflare账户中添加一个注册的域名,指向你的Nginx服务器。

使用Cloudflare的Origin CA证书加密网站的三个步骤

第1步——生成Origin CA TLS证书

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

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

保持默认选项”Generate private key and CSR with Cloudflare“(用Cloudflare生成私钥和CSR)选中。

单击下一步,您将看到一个包含”Origin Certificate“(原始证书)和”Private key“(私钥)的对话框。您需要将原始证书和私钥从Cloudflare传输到您的服务器。

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

首先,复制浏览器对话框中显示的Origin Certificate的内容,保存至/etc/ssl/cert.pem文件。

然后,返回浏览器并复制Private key的内容。保存至/etc/ssl/key.pem文件。

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

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

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

现在,您需要更新站点的Nginx配置,以使用原始证书和私钥来保护Cloudflare的服务器与您的服务器之间的连接。

打开您的网站域名对应的Nginx配置文件:
/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配置文件中都没有语法错误:

nginx-t

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

systemctl restart nginx

现在进入Cloudflare仪表板的SSL/TLS部分,导航到”Overview“(概览)选项卡,并将SSL/TLS加密模式更改为Full (strict)。这会通知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签名的证书和以下证书:

-----BEGINCERTIFICATE-----
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=
-----ENDCERTIFICATE-----

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

然后创建文件/etc/ssl/cloudflare.crt文件来保存Cloudflare的证书。

现在更新您的Nginx配置以使用TLS认证的源服务器拉取。打开您的域名对应的配置文件:

/etc/nginx/sites-available/your_domain

添加ssl_client_certificate和ssl_verify_client指令,如以下示例所示:

. . .

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,最后,要启用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的Origin CA证书加密Cloudflare和Nginx服务器之间的流量来保护由Nginx提供支持的网站。然后,您在Nginx服务器上设置Authenticated Origin Pulls,以确保它只接受Cloudflare服务器的请求,从而防止其他任何人直接连接到Nginx服务器。

Exit mobile version