用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 | listen 443 ssl http2; |
保存并重启你的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
2ssl_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 | # https://www.cloudflare.com/ips |
然后,我们在Nginx的配置下,增加如下配置
1 | include cf.conf; |
这样,所有非Nginx IP访问都会被拒绝,这样的话,整个源站的保护基本已经做到比较完善的程度了。