介绍
Cloudflare是位于访问者和网站所有者服务器之间的服务,充当网站的反向代理。 Cloudflare提供内容分发网络(CDN),以及DDoS缓解和分布式域名服务器服务。
Nginx是一个流行的Web服务器,负责托管互联网上一些最大和最高流量的网站。 组织通常使用Nginx服务网站,并将Cloudflare用作CDN和DNS提供商。
在本教程中,您将使用Cloudflare的Origin CA证书保护您的Nginx网站,并配置Nginx使用经过验证的请求。 使用此设置的优点是您可以从Cloudflare的CDN和快速DNS解析中受益,同时确保所有连接都通过Cloudflare。 这可以防止任何恶意请求到达您的服务器。
先决条件
要完成本教程,您需要以下内容:
- 遵循Ubuntu 16.04初始服务器设置指南设置的一台Ubuntu 16.04服务器,包括sudo非root用户和防火墙。
- Nginx安装在你的服务器上,如Ubuntu如何在Ubuntu 16.04上安装Nginx 。
- Cloudflare帐户。
- 添加到Cloudflare帐户的注册域指向您的Nginx服务器。 使用CloudFlare跟踪如何减轻DDoS攻击对您的网站造成的影响。
- 为您的域配置的Nginx服务器模块,您可以按照如何在Ubuntu 16.04上设置Nginx服务器模块(虚拟主机)来执行此操作 。
第1步 - 生成原始CA TLS证书
Cloudflare Origin CA允许您生成一个由Cloudflare签名的免费TLS证书,以便在您的Nginx服务器上进行安装。 通过使用Cloudflare生成的TLS证书,您可以保护Cloudflare的服务器和Nginx服务器之间的连接。
要使用Origin CA生成证书,请导航到Cloudflare仪表板的加密部分。 从那里,点击Origin Certificates部分中的Create Certificate按钮:
让CloudFlare的默认选项生成一个私钥并选择一个CSR 。
单击下一步 ,您将看到一个包含原始证书和私钥的对话框。 您需要将来自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
该文件应该看起来像这样:
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
上监听并使用您在前一节中添加的原始证书和私钥。
修改文件,使其如下所示:
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服务器之间的连接。
现在通过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_certificate
和ssl_verify_client
指令,如下例所示:
. . .
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服务器。