Heroku + Cloudflare 完全免费 SSL

27

使用Cloudflare的免费Universal SSL,尝试在Heroku上完全免费获取SSL。

阅读此文章:http://mikecoutermarsh.com/adding-ssl-to-heroku-with-cloudflare/,其中似乎暗示现在Cloudflare提供了免费的SSL。

我采取的步骤:

  • 使用Cloudflare(免费帐户)设置我的DNS
  • 将我的域名转发到我的herokuapp (CNAME example-app.com -> example-app.herokuapp.com)
  • 将Cloudflare SSL选项设置为“Full SSL”
  • 将我的域名添加到我的heroku应用程序
  • 使用此express中间件强制使用 https:

    app.use(function(req, res, next) {
        if (req.headers['x-forwarded-proto'] != 'https') {
            res.redirect('https://' + req.headers.host + req.path);
        }
        else {
            return next();
        }
    });
    

Heroku域名http://example-app.herokuapp.com正常工作,并重定向到https://example-app.herokuapp.com,绿色锁定一切。

http://example-app.comhttps://example-app.com都无法使用。浏览器标签图标只是不停地旋转而且永远不会解决。有什么办法可以让它工作吗?这真的可能吗?

*更新

看起来这实际上是可能的。来自CloudFlare支持的消息:

Hi Bill,

从根本上讲,只要“源”支持SSL连接,您就可以在CloudFlare中使用完整SSL。

Simon

CloudFlare今天发布了这篇博客文章:https://blog.cloudflare.com/universal-ssl-be-just-a-bit-more-patient/

我的网站已经开始解析,但出现了一个“您的连接不是私人连接”的消息,就像博客文章中的“您可能会看到的错误”部分一样。此外,在我的CloudFlare设置中有一个“SSL发出”警报,所以我想一旦发出它可能就会起作用。我会继续通知大家。


不,如果您想在Heroku上托管的自定义域启用SSL,则必须支付每月20美元的费用。 - idbehold
1
@Idbehold,你看过这篇文章吗?它建议你不要这样做。http://mikecoutermarsh.com/adding-ssl-to-heroku-with-cloudflare/ - Bill Johnston
顺便说一句 - 使用来自http://www.startssl.com/的免费SSL更容易实现这个。 - Imperative
1
顺便提一下,对于寻找免费 SSL 托管的任何人来说,只要您自己获取免费证书,就可以使用 OpenShift 免费托管您的自定义域名。 - Robin Winslow
@RobinWinslow,OpenShift是一种基础设施即服务(IaaS),因此您可以轻松安装SSL证书,对吧?在规格方面,它与Heroku的免费版相比如何?此外,我读到在OpenShift上只能拥有3个免费实例。 - Muhammad Umer
Openshift Online v3免费的“Starter”计划不再包括自定义域名。与此同时,Heroku从每月7美元的Hobby付费计划开始提供https://devcenter.heroku.com/articles/automated-certificate-management。 - Beni Cherniavsky-Paskin
4个回答

25

注意:Heroku和Cloudflare之间存在不安全因素。

  • 它可以与“Flexible SSL”一起使用——在Heroku和CF之间未加密的HTTP连接。我们不希望这样。
  • 它也可以与“Full SSL”一起使用——在Heroku和CF之间使用HTTPS,但没有CF验证证书。Heroku提供一个*.herokuapp.com证书,CF很高兴。不幸的是,在Heroku和CF之间的中间人可以呈现一个自签名的snakeoil.co.mordor证书,CF同样会欣然接受(用户看不到,他们只能看到CF的证书)!这在CloudFlare博客文章Introducing Strict SSL的“Full SSL”部分有记录。
  • 但是,“完全SSL(严格)”无法工作,因为CF希望Heroku出示yourdomain.com证书,并给出错误页面 :-(
    [您当然可以自己获取这样的证书,并向Heroku支付用于向CF提供服务的费用,但这回到了原点...您可以获得CDN的好处,但它并不是“完全免费的Heroku SSL”。]这种情况在CloudFlare文章Configure CloudFlare and Heroku over HTTPS中讨论。
这个Full SSL设置可接受吗?可以说CF和Heroku之间的链接可能是“在骨干网,云层之上”,对于主动攻击者相对难以控制,因此通信显然比没有TLS更安全。但它不是端到端安全的,你给用户一个错误的安全感,通常与HTTPS和绿色锁定图标相关联,有人会说这比毫无TLS更糟糕... [请参阅https://news.ycombinator.com/item?id=8382335上的意见]
截至2015年2月,我在CF中看不到配置Full Strict模式以期望某些其他域上的证书的选项。我不知道为什么CF不允许这样做,这显然是技术可行的。

我本来想要确认一下,如果您像OP建议的那样使用CNAME example.com => example.herokuapp.com进行配置,*Full SSL (Strict)*是否可行,但是后来我发现了这篇CloudFlare文章Configure CloudFlare and Heroku over HTTPS,它也说了这个问题:(在您提供的关于他们期望的证书的文章中,当他们说“证书必须[...]响应请求域名(主机名)”时,我想他们指的是用户请求中的主机名。 - JMM
完整(strict) SSL选项在源Web服务器上检查SSL证书的有效性......或需要购买来自证书颁发机构的有效证书以避免526错误。domain.herokuapp.com提供的证书是有效的。因此,您应该能够毫无问题地设置Full(strict)吗?https://support.cloudflare.com/hc/en-us/articles/200170416-What-do-the-SSL-options-mean- - Muhammad Umer
任何人都可以提供一些有效的证书。问题是针对哪个域名有效,我的理解是Full Strict需要为您想让用户看到的相同域名提供证书。我已经好几年没有使用CF了,不知道现在是否仍然如此。 - Beni Cherniavsky-Paskin

14

这确实按照我设置的方式工作。问题在于CloudFlare花了几天时间来发布他们的无限SSL。一旦在您的CloudFlare SSL设置下显示“SSL激活”,它将起作用。


1
我也是,两天前设置了Heroku和Cloudflare,今天SSL开始工作了。 - Jascha Ehrenreich
我读到过这样的说法,即用户和Cloudflare之间是安全的,但Cloudflare和您的服务器之间不安全。这是真的吗?另外,Cloudflare提供的SSL在Android 2.xx和IE上无法使用。(如果检测到并重定向到https://app.herokuapp.com/,我想这个问题可以解决) - Muhammad Umer
遗憾的是(NEW):"当应用程序迁移到新基础架构时,其默认的 appname.herokuapp.com、DNS 记录和任何 haiku.herokudns.com 自定义域名记录都会被修改为指向新路由基础架构的 IP 地址。在 24-48 小时的时间内,该应用程序可以通过新旧路由基础架构访问。当迁移完成后,该应用程序将不再通过旧路由基础架构访问,所有流量必须通过新基础架构流动。发送到旧基础架构的应用请求将返回错误代码: H31 Misdirected Request(错误的重定向请求)。" - Pat

2

CloudFlare使用CNAME平铺技术,该技术在文章中提到可以用于Heroku添加SSL证书。 - Bill Johnston
他们的CNAME平铺对我很有效,无论是针对foo.herokuapp.com还是bar-baz.rhcloud.com,而且(非常)仅限于个人经验,它不会干扰发送到webmaster@myapex.net的电子邮件(如果我理解正确,这是类似ALIAS DNS的主要风险)。 - Beni Cherniavsky-Paskin

0
要使此功能正常工作,您需要在Cloudflare上为您的域创建一个页面规则。我的规则大致如下:
URL Pattern: my-domain.co/*
Forwarding to: https://www.my-domain.co/$1

从那里,您可以使用www上的CNAME指向my-domain.herokuapp.com。

Cloudflare(以及大多数其他DNS提供商)不允许根域的CNAME记录。仅适用于子域。 www是一个子域,因此您可以将所有流量强制转到www并将其cname到heroku。


1
CloudFlare使用CNAME平铺,该文章中提到了这种可能性。但是,这对我似乎没有起作用。 - Bill Johnston
在我的Cloudflare页面规则中,我有两个规则: [http]://exaple.org to [https]://exaple.org/ 和 www.exaple.org to [https]://exaple.org这样Cloudflare会自动将我重定向到[https://]exaple.org不幸的是,Cloudflare不支持免费、专业或商业帐户的通配符子域名,而允许使用通配符的企业帐户据传每月需支付500美元。 - Jascha Ehrenreich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接