用Cloudflare和Nginx的相关配置

你那能叫活着么?你那只能叫没死。

基础知识

因为CDN的存在,所以SSL需要分为两部分,一部分是浏览器到Cloudflare CDN服务器的传输加密,一部分是Cloudflare CDN服务器到你网站服务器之间的数据传输。一般来说,如果选择Off,那你的网站全程都没有SSL加密,如果选择Flexible,那么Cloudflare CDN服务器到你网站服务器之间是明文传输,有可能存在一定的被监听风险,如果选择Full,则全程都是用SSL加密,但是并不校验网站服务器的证书有效性(所以当被中间人攻击时,仍然会有数据被监听的可能性),如果选择Full(strict),那么不仅全程都SSL加密,并且Cloudflare会验证网站服务器证书,需要是受信任的证书或者由Cloudflare签署的专门用于服务器上的证书。

加密浏览器到Cloudflare的CDN

加密这一段流量非常简单,你只需要在上面的SSL设置中,选择Off以外的其他选项,即可完成这一段的SSL加密,默认情况下,免费版本的Cloudflare提供Universal SSL证书,这类证书目前基本被大多数浏览器所信任,只是在证书名称上你看到的可能是sni.cloudflare.com的域名。如果你希望提升SSL证书的兼容性,那可以在SSL/TLS下的Edge Certificates菜单中,单独订购SSL证书,独立证书5美金一个月,订购之后,您的证书就会像下图一样属于独立域名证书,兼容性也会更好,当然,如果你有钱(例如有的企业需要OV甚至EV证书),那么你可以购买Enterprise Plan后,选择上传自己的证书,只是价格么就贵了。

加密Cloudflare CDN服务器到你网站服务器

加密这一段流量,就需要您在Nginx上做HTTPS的配置了,一般情况下,订购一个受信任的证书总是费钱的,Cloudflare建议你使用他们的Origin CA,证书周期15年且免费,使用方法也非常简单,首先在SSL/TLS的Origin Server菜单下,选择”Create Certificate“,创建一张证书,选择Cloudflare创建CSR即可,域名和时常一般不用更改,创建之后,即可保存证书和私钥,Nginx一般使用pem格式,因此把证书和私钥保存成cert.pem和key.pem两个文件,并上传到你的服务器上。
第二步,打开你的Nginx配置,加入如下的设置(假设你的证书都储存在/usr/local/nginx/conf/ssl/目录下)

1
2
3
listen 443 ssl http2;
ssl_certificate /usr/local/nginx/conf/ssl/cert.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/key.pem;

保存并重启你的Nginx服务器后,在SSL/TLS下选择Full(strict)模式,即可完成Cloudflare CDN服务器到你网站服务器之间的加密了。

使用Authenticated Origin Pulls

Authenticated Origin Pulls保证了客户端在获取你网站服务器的内容时,需要提交客户端证书验证,否则不允许访问,这个设置通常可以进一步防止你的服务器数据被非Cloudflare CDN服务器访问,当你的源站全站采用CDN后,可以打开这个选项进一步提升安全性,在打开之前,需要在Nginx上做如下配置:

  • 下载Origin Pull证书:https://support.cloudflare.com/hc/zh-cn/article_attachments/360044928032/origin-pull-ca.pem ,并保存为origin-pull-ca.crt
  • 在Nginx的配置中,加入如下两行配置(假设你的证书都储存在/usr/local/nginx/conf/ssl/目录下)
    1
    2
    ssl_client_certificate /usr/local/nginx/conf/ssl/origin-pull-ca.crt;
    ssl_verify_client on;
  • 重启Nginx,此时再访问你的网站,会出现400错误,那说明Nginx已经配置成功,这个时候去Cloudflare后台打开Authenticated Origin Pulls的开关,即可实现对源站内容的进一步保护

终极:屏蔽非Cloudflare CDN的访问

当然,终极策略,我们可以考虑在Nginx上,屏蔽一切非Cloudflare CDN服务器的访问,我们可以在 https://www.cloudflare.com/ips/ 看到所有Cloudflare使用的IP,我们可以在新建一个如下的cf.conf的配置,填写如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# https://www.cloudflare.com/ips
# IPv4
allow 173.245.48.0/20;
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 141.101.64.0/18;
allow 108.162.192.0/18;
allow 190.93.240.0/20;
allow 188.114.96.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;
allow 162.158.0.0/15;
allow 104.16.0.0/12;
allow 172.64.0.0/13;
allow 131.0.72.0/22;

# IPv6
allow 2400:cb00::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2405:b500::/32;
allow 2405:8100::/32;
allow 2a06:98c0::/29;
allow 2c0f:f248::/32;

然后,我们在Nginx的配置下,增加如下配置

1
2
include cf.conf;
deny all;

这样,所有非Nginx IP访问都会被拒绝,这样的话,整个源站的保护基本已经做到比较完善的程度了。

https://jayshao.com/cloudflare-nginx-ssl/