作者选择了 Electronic Frontier Foundation作为 Write for Donations计划的一部分接受捐款。
介绍
Cloudflare是一个服务,位于访问者和网站所有者的服务器之间,作为网站的反向代理服务器。
Nginx是一個受歡迎的網頁伺服器,負責在互聯網上一些最大的和流量最高的網站。
在本教程中,您将使用来自Cloudflare的Origin CA证书保护您的网站,并配置 Nginx以使用身份验证的拉动请求。使用此设置的优点是您可以从Cloudflare的CDN和快速的DNS分辨率中受益,同时确保所有连接都通过Cloudflare。
前提条件
要完成本教程,您将需要以下内容:
一个 Ubuntu 16.04 服务器设置为遵循 Ubuntu 16.04 初始服务器安装指南,包括一个 sudo 非根用户和防火墙。
Nginx 安装在您的服务器上,如在 如何在 Ubuntu 16.04 上安装 Nginx所示。
A Cloudflare帐户.
已注册的域名添加到您的 Cloudflare帐户,指向您的 Nginx 服务器。 按照 如何通过 CloudFlare 缓解您的网站的 DDoS 攻击来设置此设置。
配置为您的域名的 Nginx 服务器块,您可以通过以下操作来设置 如何在 Ubuntu 16.04 上设置 Nginx 服务器块(虚拟主机) )。
步骤 1 – 生成原始 CA TLS 证书
Cloudflare Origin CA 允许您生成由 Cloudflare 签名的免费 TLS 证书,将其安装在您的 Nginx 服务器上。
要使用 Origin CA 生成证书,请前往 Cloudflare 仪表板的 Crypto 部分,从那里点击 Create Certificate 按钮,在 Origin Certificates 部分:
留下默认选项 ** 让 CloudFlare 生成私钥和 CSR** 选项。
点击 ** 下一步**,您将看到一个对话框 ** 原始证书和 ** 私钥.您需要将原始证书和私钥从 CloudFlare 传输到您的服务器。
我们将使用服务器上的/etc/ssl/certs
目录来保留原始证书。/etc/ssl/private
目录将保留私钥文件。
首先,复制浏览器中的对话框中显示的原产地证书
的内容。
然后,在您的服务器上,打开 /etc/ssl/certs/cert.pem
来编辑:
1sudo nano /etc/ssl/certs/cert.pem
将证书内容粘贴到文件中,然后保存并退出编辑器。
然后返回浏览器并复制隐私密钥的内容. 打开文件 /etc/ssl/private/key.pem
进行编辑:
1sudo nano /etc/ssl/private/key.pem
将密钥粘贴到文件中,保存文件,然后离开编辑器。
<$>[警告] 警告: Cloudflare 的原始 CA 证书仅由 Cloudflare 信任,因此只能由与 Cloudflare 积极连接的原始服务器使用。
现在您已将密钥和证书文件复制到您的服务器,您需要更新 Nginx 配置以使用它们。
步骤 2 — 在 Nginx 中安装 Origin CA 证书
在上一节中,您使用Cloudlfare的仪表板生成了原始证书和私钥,并将文件保存到您的服务器上。
Nginx 在安装过程中创建默认服务器块,如果它存在的话,请删除它,因为您已经为您的域配置了自定义服务器块:
1sudo rm /etc/nginx/sites-enabled/default
接下来,打开您的域的 Nginx 配置文件:
1sudo nano /etc/nginx/sites-available/example.com
檔案應該是這樣的:
1[label /etc/nginx/sites-available/example.com]
2server {
3 listen 80;
4 listen [::]:80;
5
6 root /var/www/example.com/html;
7 index index.html index.htm index.nginx-debian.html;
8
9 server_name example.com www.example.com;
10
11 location / {
12 try_files $uri $uri/ =404;
13 }
14}
我们将修改 Nginx 配置文件以执行以下操作:
- 倾听端口
80
并重定向所有请求使用https
- 倾听端口
443
并使用您在上一节添加的原始证书和私钥
更改文件,以便它看起来如下:
1[label /etc/nginx/sites-available/example.com]
2server {
3 listen 80;
4 listen [::]:80;
5 server_name example.com www.example.com;
6 return 302 https://$server_name$request_uri;
7}
8
9server {
10
11 # SSL configuration
12
13 listen 443 ssl http2;
14 listen [::]:443 ssl http2;
15 ssl on;
16 ssl_certificate /etc/ssl/certs/cert.pem;
17 ssl_certificate_key /etc/ssl/private/key.pem;
18
19 server_name example.com www.example.com;
20
21 root /var/www/example.com/html;
22 index index.html index.htm index.nginx-debian.html;
23
24 location / {
25 try_files $uri $uri/ =404;
26 }
27}
保存文件并离开编辑器。
接下来,测试以确保您的任何 Nginx 配置文件中没有语法错误:
1sudo nginx -t
如果没有发现任何问题,请重新启动 Nginx 以启用您的更改:
1sudo systemctl restart nginx
现在,进入 Cloudflare 仪表板的 Crypto 部分,并将 SSL 模式更改为 Full. 这会告知 Cloudflare 始终加密 Cloudflare 和您的源 Nginx 服务器之间的连接。
现在,请访问您的网站在https://example.com
,以确认它是正确设置的。您将看到您的主页显示,浏览器将报告该网站是安全的。
在下一节中,您将设置 Authenticated Origin Pulls 来验证您的原始服务器确实在与 Cloudflare 交谈,而不是其他服务器。
步骤 3 – 设置身份验证的起源提取器
Origin CA 证书将帮助 Cloudflare 验证它是否正在与正确的原始服务器进行交谈,但您的原始 Nginx 服务器如何可以验证它是否实际上正在与 Cloudflare 进行交谈?输入 TLS 客户端身份验证。
在客户端认证的 TLS 握手中,双方都提供要验证的证书。原始服务器配置为仅接受使用 Cloudflare 有效客户端证书的请求。未通过 Cloudflare 的请求将被删除,因为它们将没有 Cloudflare 证书。
Cloudflare 提供由 CA 签署的证书,具有以下证书:
1-----BEGIN CERTIFICATE-----
2MIIGBjCCA/CgAwIBAgIIV5G6lVbCLmEwCwYJKoZIhvcNAQENMIGQMQswCQYDVQQG
3EwJVUzEZMBcGA1UEChMQQ2xvdWRGbGFyZSwgSW5jLjEUMBIGA1UECxMLT3JpZ2lu
4IFB1bGwxFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgNVBAgTCkNhbGlmb3Ju
5aWExIzAhBgNVBAMTGm9yaWdpbi1wdWxsLmNsb3VkZmxhcmUubmV0MB4XDTE1MDEx
6MzAyNDc1M1oXDTIwMDExMjAyNTI1M1owgZAxCzAJBgNVBAYTAlVTMRkwFwYDVQQK
7ExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmlnaW4gUHVsbDEWMBQGA1UE
8BxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZvcm5pYTEjMCEGA1UEAxMa
9b3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
10DwAwggIKAoICAQDdsts6I2H5dGyn4adACQRXlfo0KmwsN7B5rxD8C5qgy6spyONr
11WV0ecvdeGQfWa8Gy/yuTuOnsXfy7oyZ1dm93c3Mea7YkM7KNMc5Y6m520E9tHooc
12f1qxeDpGSsnWc7HWibFgD7qZQx+T+yfNqt63vPI0HYBOYao6hWd3JQhu5caAcIS2
13ms5tzSSZVH83ZPe6Lkb5xRgLl3eXEFcfI2DjnlOtLFqpjHuEB3Tr6agfdWyaGEEi
14lRY1IB3k6TfLTaSiX2/SyJ96bp92wvTSjR7USjDV9ypf7AD6u6vwJZ3bwNisNw5L
15ptph0FBnc1R6nDoHmvQRoyytoe0rl/d801i9Nru/fXa+l5K2nf1koR3IX440Z2i9
16+Z4iVA69NmCbT4MVjm7K3zlOtwfI7i1KYVv+ATo4ycgBuZfY9f/2lBhIv7BHuZal
17b9D+/EK8aMUfjDF4icEGm+RQfExv2nOpkR4BfQppF/dLmkYfjgtO1403X0ihkT6T
18PYQdmYS6Jf53/KpqC3aA+R7zg2birtvprinlR14MNvwOsDOzsK4p8WYsgZOR4Qr2
19gAx+z2aVOs/87+TVOR0r14irQsxbg7uP2X4t+EXx13glHxwG+CnzUVycDLMVGvuG
20aUgF9hukZxlOZnrl6VOf1fg0Caf3uvV8smOkVw6DMsGhBZSJVwao0UQNqQIDAQAB
21o2YwZDAOBgNVHQ8BAf8EBAMCAAYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4E
22FgQUQ1lLK2mLgOERM2pXzVc42p59xeswHwYDVR0jBBgwFoAUQ1lLK2mLgOERM2pX
23zVc42p59xeswCwYJKoZIhvcNAQENA4ICAQDKDQM1qPRVP/4Gltz0D6OU6xezFBKr
24LWtDoA1qW2F7pkiYawCP9MrDPDJsHy7dx+xw3bBZxOsK5PA/T7p1dqpEl6i8F692
25g//EuYOifLYw3ySPe3LRNhvPl/1f6Sn862VhPvLa8aQAAwR9e/CZvlY3fj+6G5ik
263it7fikmKUsVnugNOkjmwI3hZqXfJNc7AtHDFw0mEOV0dSeAPTo95N9cxBbm9PKv
27qAEmTEXp2trQ/RjJ/AomJyfA1BQjsD0j++DI3a9/BbDwWmr1lJciKxiNKaa0BRLB
28dKMrYQD+PkPNCgEuojT+paLKRrMyFUzHSG1doYm46NE9/WARTh3sFUp1B7HZSBqA
29kHleoB/vQ/mDuW9C3/8Jk2uRUdZxR+LoNZItuOjU8oTy6zpN1+GgSj7bHjiy9rfA
30F+ehdrz+IOh80WIiqs763PGoaYUyzxLvVowLWNoxVVoc9G+PqFKqD988XlipHVB6
31Bz+1CD4D/bWrs3cC9+kk/jFmrrAymZlkFX8tDb5aXASSLJjUjcptci9SKqtI2h0J
32wUGkD7+bQAr+7vr8/R+CBmNMe7csE8NeEX6lVMF7Dh0a1YKQa6hUN18bBuYgTMuT
33QzMmZpRpIBB321ZBlcnlxiTJvWxvbCPHKHj20VwwAz7LONF59s84ZsOqfoBv8gKM
34s0s5dsq5zpLeaw==
35-----END CERTIFICATE-----
您也可以直接从Cloudflare下载证书(https://support.cloudflare.com/hc/en-us/article_attachments/201243967/origin-pull-ca.pem)。
复制此证书。
然后创建文件 /etc/ssl/certs/cloudflare.crt
以保留 Cloudflare 证书:
1sudo nano /etc/ssl/certs/cloudflare.crt
将证书粘贴到文件中,然后保存文件并退出编辑器。
现在更新您的 Nginx 配置以使用 TLS Authenticated Origin Pulls. 打开您的域的配置文件:
1sudo nano /etc/nginx/sites-available/example.com
添加ssl_client_certificate
和ssl_verify_client
指令,如下示例所示:
1[label /etc/nginx/sites-available/example.com]
2. . .
3
4server {
5
6 # SSL configuration
7
8 listen 443 ssl http2;
9 listen [::]:443 ssl http2;
10 ssl on;
11 ssl_certificate /etc/ssl/certs/cert.pem;
12 ssl_certificate_key /etc/ssl/private/key.pem;
13 ssl_client_certificate /etc/ssl/certs/cloudflare.crt;
14 ssl_verify_client on;
15
16 . . .
保存文件并离开编辑器。
接下来,测试以确保您的 Nginx 配置中没有语法错误。
1sudo nginx -t
如果没有发现任何问题,请重新启动 Nginx 以启用您的更改:
1sudo systemctl restart nginx
最后,要启用认证提取,请在 Cloudflare 仪表板中打开 Crypto 部分,然后切换 Authenticated Origin Pulls 选项。
现在,请访问您的网站在https://example.com
,以确认它是正确设置的。 就像以前一样,您将看到您的主页显示。
要验证您的服务器只接受 Cloudflare 的 CA 签署的请求,请切换 Authenticated Origin Pulls 选项以禁用它,然后重新加载您的网站。
如果请求未由 Cloudflare 的 CA 签署,您的源服务器会引发错误。
现在你知道它正常工作了,回到Cloudflare仪表板的 Crypto部分,然后重新切换 Authenticated Origin Pulls选项来启用它。
结论
在本教程中,您通过使用来自 Cloudflare 的 Origin CA 证书来加密 Cloudflare 和 Nginx 服务器之间的流量来保护您的 Nginx 驱动的网站,然后在 Nginx 服务器上设置 Authenticated Origin Pulls,以确保它只接受来自 Cloudflare 服务器的请求,从而防止任何人直接连接到 Nginx 服务器。