如何正确启用 CloudFlare SSL

小助手读文章 00:00 / 00:00

写这篇文章的起因,是站点使用 CloudFlare CDN ,并启用 SSL 时,访问出现了无限 301 跳转,而访问源站是正常的,说明错误出现在 CloudFlare,经查询相关资料,解决了这个问题,整理一下做个记录。

简介

CloudFlare 是一家以向客户提供网站安全管理、性能优化及相关的技术支持为主要业务的 IT 企业。主要提供通过基于反向代理的内容分发网络(Content Delivery Network,CDN)及分布式域名解析服务(Distributed Domain Name Server),CloudFlare 可以帮助受保护站点抵御包括拒绝服务攻击在内的大多数网络攻击,确保该网站长期在线,同时提升网站的性能、加载速度以改善访客体验。

绑定域名

要使用 CloudFlare 提供的 SSL 泛域名证书服务,需要先绑定域名,绑定有两种方式,一是直接注册账号,将域名托管于 CloudFlare,二是通过合作伙伴,以 CNAME 方式接入,但不管是哪种方式,本质上都是使用 CloudFlare 的 CDN。

托管 DNS

这是最快的方式,在 DNS 页面,将需要启用 SSL 的域名右边的云图标点亮即可:

托管 DNS

CNAME

CNMAE 方式无需将 DNS 托管于 CloudFlare,对于使用其他域名解析商又想用 CloudFlare CDN 和 SSL 证书的朋友这是非常有用的,本站已加入合作伙伴,具体接入方法参见:

使用 CNAME 接入 CloudFlare 新玩法

启用 SSL

CloudFlare SSL 管理都在控制台 - Crypto 处,其实默认情况下,一接入 CloudFlare CDN 就启用了 SSL,这里说说需要注意的几个地方。

SSL

默认情况下,CloudFlare 启用的 SSL 模式是 Flexible,还有三个选项是 Off、Full、Full(strict):

SSL

那么这几个有什么区别呢?下面以几张图形象地阐释:

cfssl_off

cfssl_flexible

cfssl_full

cfssl_strict

看明白了吗?

用户端到 CloudFlare 的访问称之为 A,CloudFlare 到服务端的访问称之为 B:

  • Off:全程 HTTP;
  • Flexible:A 使用 HTTPS,B 使用 HTTP,称为灵活加密;
  • Full:全程使用 HTTPS,允许 B 程服务端使用自签名证书;
  • Full(strict):全程使用 HTTPS,与 Full 的区别在于 B 程服务端必须使用有效的可信任证书;

到这里,我们就知道了为什么会出现 301 反复跳转了:

当服务端启用 HTTPS 时,一般都会再强制 HTTP 跳转 HTTPS,而 CloudFlare 默认启用的 SSL 策略是 Flexible。也就是说,当用户访问时,对于用户看到是 HTTPS,但对于服务器来说,访问方式却是 HTTP,所以服务器返回的状态都是 301。解决方法也很简单,将 SSL 策略设为 Full 或者 Full(strict) 即可。从 Flexible 和 Full(strict) 返回码中,我们也可以看出二者区别:

HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 05:39:59 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Set-Cookie: __cfduid=d98400c55561c1bb4f463fac5e43dcc581530423598; expires=Mon, 01-Jul-19 05:39:58 GMT; path=/; domain=.vircloud.net; HttpOnly
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 05:36:55 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Set-Cookie: __cfduid=d2793492c99cc8d14242c2cb6125b89ca1530423408; expires=Mon, 01-Jul-19 05:36:48 GMT; path=/; domain=.vircloud.net; HttpOnly; Secure

Automatic HTTPS Rewrites

SSL.Auto

如果网站包含通过 HTTPS 安全访问的 HTTP URL 的引用,则自动 HTTPS 重写可以提供自动将 HTTP 改为 HTTPS。

如何判断有没有 HTTP URL?如果通过 HTTPS 连接到站点并且小绿锁图标不存在,或者链接栏上有一个黄色警告三角形,则说明站点可能包含对 HTTP 资源的引用(“ 混合内容 ”),但某些外部资源可能根本没有 HTTPS,在情况下,Cloudflare 无法重写 URL。

Always use HTTPS

SSL.Always

与 Automatic HTTPS Rewrites 差不多,可以理解为前者为能提升为 HTTPS 则提升,而此项为都提升。

Disable Universal SSL

Disable.SSL

从 CloudFlare 边缘节点删除 CloudFlare 颁发的证书,并禁止 CloudFlare 再颁发证书,此项影响当前域名的所有子域名。若禁用后续若启用上面说的几项配置,网站将无法访问。

其他选项,比如 HTTP Strict Transport Security (HSTS) 视需要是否开启,对用户访问影响不大。

经过这次问题处理经过,发现 CloudFlare 帮助中心本身已经比较完备了,使用中遇到使用问题,首先要做的应该去帮助查找解决方案,而不是去搜索引擎搜索。。。


你可能还需要《使用 CNAME 接入 CloudFlare 新玩法


参考文章:
1、《Why isn't SSL working for my site?
2、《How do I use Automatic HTTPS Rewrites?
3、《How do I fix mixed content issues or the infinite redirect loop error after enabling Flexible SSL with WordPress?
4、《将你的网站加上https — Cloudflare


ArmxMod for Typecho
个性化、自适应、功能强大的响应式主题

推广

 继续浏览关于 cloudflare教程SSL证书 的文章

 本文最后更新于 2018/07/16 11:24:07,可能因经年累月而与现状有所差异

 引用转载请注明:VirCloud's Blog > 运维 > 如何正确启用 CloudFlare SSL

精选评论

  1. 清秋暖冬

    今天早上我加上腾讯云的cdn以后也是301重定向过多 :qaq: ,在朋友帮忙下把回源地址跟宝塔面板的强制ssl关闭以后,可以正常访问我的域名了 :tian:

    1. 欧文斯

      修改服务器配置来适应 CDN 的做法其实感觉有点本末倒置了,因为只要源站直接访问没问题,那么问题基本上是 CDN 的问题了。

  2. 子午

    这个主要是服务器做了强制跳转https引起的,用了CDN服务器那倒是用不着再做证书了。

    1. 欧文斯

      CDN 到服务器最好也启用 SSL 咯