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

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

介绍

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

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

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

先决条件

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

第1步 - 生成原始CA TLS证书

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

要使用Origin CA生成证书,请导航到Cloudflare仪表板的加密部分。 从那里,点击Origin Certificates部分中的Create Certificate按钮:

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

让CloudFlare的默认选项生成一个私钥并选择一个CSR

起源CA GUI选项

单击下一步 ,您将看到一个包含原始证书私钥的对话框。 您需要将来自CloudFlare的原始证书和私钥传输到您的服务器。

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

我们将使用服务器上的/etc/ssl/certs目录来保存原始证书。 /etc/ssl/private目录将保存私钥文件。 这两个文件夹已经存在于服务器上。

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

然后,在您的服务器上,打开/etc/ssl/certs/cert.pem进行编辑:

sudo nano /etc/ssl/certs/cert.pem

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

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

sudo nano /etc/ssl/private/key.pem

将密钥粘贴到文件中,保存文件并退出编辑器。

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

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

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

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

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

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

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

sudo nano /etc/nginx/sites-available/example.com

该文件应该看起来像这样:

example.com'> / etc / nginx / sites-available / example.com
server {
        listen 80;
        listen [::]:80;

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

        server_name example.com www.example.com;

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

我们将修改Nginx配置文件来执行以下操作:

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

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

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

server {

    # SSL configuration

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

    server_name example.com www.example.com;

    root /var/www/example.com/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模式更改为完整 这会通知Cloudflare始终加密Cloudflare与原始Nginx服务器之间的连接。

在Cloudflare仪表板中启用完整SSL模式

现在通过https:// example.com访问您的网站,验证其设置是否正确。 你会看到你的主页显示,并且浏览器会报告该网站是安全的。

在下一节中,您将设置Authenticated Origin Pulls来验证您的源服务器确实与Cloudflare对话,而不是其他服务器。 通过这样做,Nginx将被配置为只接受使用来自Cloudflare的有效客户端证书的请求,并且未通过CloudFlare的请求将被丢弃。

第3步 - 设置认证来源提取

Origin CA证书将帮助Cloudflare确认它正在与正确的源服务器交谈。 但是,您的原始Nginx服务器如何确认它实际上是在与Cloudflare交谈? 输入TLS客户端身份验证。

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

Cloudflare提供由CA签署的证书,证书如下:

-----BEGIN CERTIFICATE-----
MIIGBjCCA/CgAwIBAgIIV5G6lVbCLmEwCwYJKoZIhvcNAQENMIGQMQswCQYDVQQG
EwJVUzEZMBcGA1UEChMQQ2xvdWRGbGFyZSwgSW5jLjEUMBIGA1UECxMLT3JpZ2lu
IFB1bGwxFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgNVBAgTCkNhbGlmb3Ju
aWExIzAhBgNVBAMTGm9yaWdpbi1wdWxsLmNsb3VkZmxhcmUubmV0MB4XDTE1MDEx
MzAyNDc1M1oXDTIwMDExMjAyNTI1M1owgZAxCzAJBgNVBAYTAlVTMRkwFwYDVQQK
ExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmlnaW4gUHVsbDEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZvcm5pYTEjMCEGA1UEAxMa
b3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDdsts6I2H5dGyn4adACQRXlfo0KmwsN7B5rxD8C5qgy6spyONr
WV0ecvdeGQfWa8Gy/yuTuOnsXfy7oyZ1dm93c3Mea7YkM7KNMc5Y6m520E9tHooc
f1qxeDpGSsnWc7HWibFgD7qZQx+T+yfNqt63vPI0HYBOYao6hWd3JQhu5caAcIS2
ms5tzSSZVH83ZPe6Lkb5xRgLl3eXEFcfI2DjnlOtLFqpjHuEB3Tr6agfdWyaGEEi
lRY1IB3k6TfLTaSiX2/SyJ96bp92wvTSjR7USjDV9ypf7AD6u6vwJZ3bwNisNw5L
ptph0FBnc1R6nDoHmvQRoyytoe0rl/d801i9Nru/fXa+l5K2nf1koR3IX440Z2i9
+Z4iVA69NmCbT4MVjm7K3zlOtwfI7i1KYVv+ATo4ycgBuZfY9f/2lBhIv7BHuZal
b9D+/EK8aMUfjDF4icEGm+RQfExv2nOpkR4BfQppF/dLmkYfjgtO1403X0ihkT6T
PYQdmYS6Jf53/KpqC3aA+R7zg2birtvprinlR14MNvwOsDOzsK4p8WYsgZOR4Qr2
gAx+z2aVOs/87+TVOR0r14irQsxbg7uP2X4t+EXx13glHxwG+CnzUVycDLMVGvuG
aUgF9hukZxlOZnrl6VOf1fg0Caf3uvV8smOkVw6DMsGhBZSJVwao0UQNqQIDAQAB
o2YwZDAOBgNVHQ8BAf8EBAMCAAYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4E
FgQUQ1lLK2mLgOERM2pXzVc42p59xeswHwYDVR0jBBgwFoAUQ1lLK2mLgOERM2pX
zVc42p59xeswCwYJKoZIhvcNAQENA4ICAQDKDQM1qPRVP/4Gltz0D6OU6xezFBKr
LWtDoA1qW2F7pkiYawCP9MrDPDJsHy7dx+xw3bBZxOsK5PA/T7p1dqpEl6i8F692
g//EuYOifLYw3ySPe3LRNhvPl/1f6Sn862VhPvLa8aQAAwR9e/CZvlY3fj+6G5ik
3it7fikmKUsVnugNOkjmwI3hZqXfJNc7AtHDFw0mEOV0dSeAPTo95N9cxBbm9PKv
qAEmTEXp2trQ/RjJ/AomJyfA1BQjsD0j++DI3a9/BbDwWmr1lJciKxiNKaa0BRLB
dKMrYQD+PkPNCgEuojT+paLKRrMyFUzHSG1doYm46NE9/WARTh3sFUp1B7HZSBqA
kHleoB/vQ/mDuW9C3/8Jk2uRUdZxR+LoNZItuOjU8oTy6zpN1+GgSj7bHjiy9rfA
F+ehdrz+IOh80WIiqs763PGoaYUyzxLvVowLWNoxVVoc9G+PqFKqD988XlipHVB6
Bz+1CD4D/bWrs3cC9+kk/jFmrrAymZlkFX8tDb5aXASSLJjUjcptci9SKqtI2h0J
wUGkD7+bQAr+7vr8/R+CBmNMe7csE8NeEX6lVMF7Dh0a1YKQa6hUN18bBuYgTMuT
QzMmZpRpIBB321ZBlcnlxiTJvWxvbCPHKHj20VwwAz7LONF59s84ZsOqfoBv8gKM
s0s5dsq5zpLeaw==
-----END CERTIFICATE-----

您也可以在这里直接从Cloudflare下载证书。

复制此证书。

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

sudo nano /etc/ssl/certs/cloudflare.crt

将证书粘贴到文件中。 然后保存该文件并退出编辑器。

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

sudo nano /etc/nginx/sites-available/example.com

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

example.com'> / etc / nginx / sites-available / example.com
. . .

server {

    # SSL configuration

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

    . . .

保存文件并退出编辑器。

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

sudo nginx -t

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

sudo systemctl restart nginx

最后,要启用Authenticated Pulls,请打开Cloudflare仪表板中的Crypto部分并切换Authenticated Origin Pulls选项。

启用已验证的原点拉动

现在通过https:// example.com访问您的网站,确认它已正确设置。 和以前一样,你会看到你的主页显示。

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

错误信息

如果请求未由Cloudflare的CA签署,您的原始服务器会产生错误。

现在您知道它可以正常工作,请返回Cloudflare仪表板中的加密部分,并再次切换已验证的原点拉动选项以启用它。

结论

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