Heroku:如何在免费计划中设置SSL证书?

54

我想为我在Heroku上的一个程序(基于nodeJS+Vue的简单应用)设置一些SSL证书。

我知道如果升级到Hobby计划(每月7美元),它可以自动完成。

但现在对于一个测试应用来说,这太贵了,所以我想知道是否可以通过免费计划实现类似的目标。

那么: 在Heroku上仅使用免费计划是否可能为应用设置SSL证书? 也许可以通过CLI的复杂/棘手方式实现吗?

从Heroku的页面和文档中看起来似乎不可能。 但我还是要问一下 :)


2
自2021年1月11日起,使用Heroku ACM生成的自动证书(用于Heroku上的TLS/HTTPS终止)将与大多数运行在Android v.7.1.1之前版本的软件不兼容(约占当前活跃的Android设备的34%),因此这个问题将变得更加重要。 - J0ANMM
@stellavalerio 请接受我的答案。它是最高投票的,你因此获得了金徽章。在接受我的答案后,stackoverflow会向更多人推荐它。 - Yashdeep Raj
10个回答

55

这里有一个更好的解决方案。由于Heroku免费计划不提供SSL,您可以使用Cloudflare提供的免费SSL。您可以将Cloudflare用作SSL桥接器。

要求:

  1. Cloudflare账户
  2. 您的应用程序不应具有内置的SSL重定向(如redirect-ssl),否则这将导致过多的重定向错误。

步骤1:将域名指向CloudFlare。您基本上打开一个帐户并在提示时输入您的域名。您可能会收到更改域名服务器的说明。

步骤2:在Cloudflare的DNS中添加Heroku服务器的Cname记录。说明在此处。这里你会遇到一些SSL安全问题。

步骤3:现在将您的SSL / TLS加密模式更改为Flexible(而非Full)。*重要 enter image description here

现在理解工作原理:

客户端(浏览器)向https://example.com 发出请求。 首先,请求通过SSL到达Cloudflare(用户看到加密连接到服务器)。

然后,Cloudflare使用非SSL(非Https和未加密)向Heroku服务器(Origin)发出请求。

然后,Heroku服务器(Origin)以非SSL形式将响应返回给Cloudflare。

最终,Cloudflare将请求转发给客户端(浏览器)。


你可能会想,仅加密一半的系统有什么好处。但“有总比没有强”。

你来到这里是因为不想花钱购买Heroku付费动力。

这种方法对于那些使用http的人来说更好。至少它保护了最脆弱的一面(客户端)。大多数攻击发生的地方。在Cloudflare和您的服务器之间,攻击的几率非常小。因为网络可达性。

具有较低易受攻击概率比100%易受攻击的系统更好。


我已经测试过这种方法,并且适用于https://www.auedbaki.com


1
我相信你需要使用Cloudflare的DNS才能使其正常工作,但这很容易使用,而且他们支持CNAME平铺,因此您可以使用CNAME将根域指向Heroku网站。这对我非常有效,谢谢! - Keith Bennett
1
为了获得更好的结果,在Edge证书选项卡中设置“始终使用HTTPS”。您也可以在子域上使用SSL。 - Ungapps
9
为什么你希望只加密请求路由的一半呢?是为了让用户在浏览器中看到绿色锁头,从而认为你的网站是安全的吗?这样做不好...请注意保护用户的信息安全。 - michcio1234
6
比起在浏览器中看到不安全的警告,这是更好的选择。我们知道这并不是好的做法。但这是获取免费 SSL 的唯一途径,而且不需要花一分钱。 - Yashdeep Raj
1
获取 err ssl 版本或密码不匹配 - Coder Gautam YT
显示剩余6条评论

30

虽然回复晚了,但我在这里补充,我刚刚花了一个小时尝试在Heroku上设置SSL,结果走进了死胡同。

重点是,Heroku提到它们提供免费的SSL证书,但实际上除非你有Hobby(每月7美元)或Pro计划,否则不是这样的。

这个链接有更多详细信息和其他用户面对相同问题的反馈。

关于LetsEncrypt的答案是不正确的。尽管您可以获得免费证书,但不能将其包括在免费的Heroku应用程序中。

其他用户指向这篇文章并提供了一步一步的指南,但该指南已过时,而且“Labs”选项在Heroku上不再可用。

请查看下面的评论以获取一些替代建议

在我特定的情况下,我能够在zeit上获得免费的SSL。


2
感谢alphazeta的回答。在这几个月中,我也得出了同样的结论:不可能。悲伤但真实。但是我重新安排了我的项目,把它变成了带有一些服务的静态页面,现在我不再需要Heroku了。吸取了教训 :) - stellavalerio
你最终使用了哪个服务?请告诉我,这样我就可以在上面的答案中作为未来参考的建议。 - alphazeta
2
我完全改变了我的技术栈。我的主要应用现在是一个静态网站,托管在Zeit now(https://zeit.co/)上。在这里,我可以获得免费的SSL和自定义域名。因此SSL问题已解决。对于我需要的服务器功能(联系表格),现在我的静态网站通过ajax使用另一个节点应用程序,在Heroku上托管。 - stellavalerio
3
据我所知,Vercel.com 收购了 Zeit。我无法在 Vercel.com 上找到任何 SSL 服务。 - J0ANMM

21

这是如何使用Cloudflare免费获得完整的SSL证书。

enter image description here

步骤1:将您的域名指向CloudFlare。您只需打开一个帐户并在提示时输入您的域名即可。您可能会收到更改域名服务器的说明。
步骤2:在Cloudflare的DNS中添加Heroku服务器的Cname记录。说明在这里。这里您将遇到一些SSL安全问题。
步骤3:现在将您的SSL/TLS加密模式更改为Full
步骤4:在DNS设置中,您需要创建一个CNAME:yourdomain.com -> yourapp.herokuapp.com。
(我在这里了解了一般方法 https://mikecoutermarsh.com/adding-ssl-to-heroku-with-cloudflare/ 虽然它有点旧,但仍然有效。)

如何调整网站重定向? - cikatomo
1
遗憾的是(NEW):“当应用程序迁移到新基础架构时,其默认的appname.herokuapp.com、DNS记录以及任何haiku.herokudns.com自定义域记录都会被修改为指向新路由基础架构的IP地址。在24-48小时的时间内,该应用程序可以通过新旧两个路由基础架构访问。当迁移完成后,该应用程序将不再通过旧的路由基础架构访问,并且所有流量必须通过新的基础架构流动。发送到旧基础架构的应用请求将导致错误代码:H31 Misdirected Request。” - Pat
1
这比得票最高的答案更有意义。我唯一的担忧是 - 让CloudFlare看到未加密的用户数据是否安全? - michcio1234

8
我也遇到了这个问题。我想为我的React应用程序在Heroku的免费账户上设置自定义域名。我在网上搜索了很多信息,阅读了许多Heroku支持文档。
结论是,在Heroku的免费账户上,不能设置带有SSL证书的自定义域名。如果您需要使用自定义域名的SSL,请升级到他们的任何付费托管账户。
Heroku确实为其免费账户提供SSL证书,只要它不使用自定义域名。因此,标准的免费账户URL将类似于“https://your-app-name.herokuapp.com
注意:Google Firebase允许使用免费托管和自定义域名,并提供SSL,在达到一定流量限制之前是免费的收费。对于测试应用程序来说,这将是一个完美的替代方案。我正在使用它。而且设置我的自定义域名很容易。
我希望这可以为您节省数小时的搜索。

6

由于你没有明确说明是否需要将SSL证书应用于自定义域名,因此我认为有必要根据Heroku文档指出:

使用免费dynos的应用程序如果需要SSL,则可以使用*.herokuapp.com证书。

https://devcenter.heroku.com/articles/ssl

也许未来的读者会发现这个答案有用...


4
如果你正在使用免费的Heroku,你将无法使用免费SSL或者付费SSL。
如果你使用付费的Heroku,你可以获得免费SSL并且还可以使用付费的SSL。
解决方法: 1.购买Heroku付费服务。 2.迁移到Netlify或其他替代品。

2

在Heroku中,免费的SSL并不存在,或者说在免费计划中无法实现。

如果您想在Heroku中使用任何第三方的付费SSL证书或免费的第三方SSL证书,您必须更改为Hobby或Professional dynos才能使SSL工作。

如果您正在使用Heroku,则更简单的方法是无需购买第三方SSL证书,只需更改为Hobby或Professional dynos即可。

要更改dyno类型,请选择您的应用程序,转到上部的部分,在下面,单击更改Dyno类型按钮。

Hobby Dyno每月需要支付7美元,而Professional Dyno每月需要支付25-500美元不等。

完成所有操作后,请记得转到您的Rails应用程序

前往 .../config/environments/production.rb

--> 取消以下行的注释:

# config.force_ssl = true

---> 至:

config.force_ssl = true

之后,您将能够获得SSL证书但不是免费的


2
如果您不介意将前端托管在其他服务上,您可以在Vercel上托管它,拥有免费的SSL,同时保留您的后端在Heroku上。非常简单!

https://vercel.com/


0

解决这个问题的一种方法是在可以设置SSL证书的主机上设置代理服务器,然后使用加密简单地转发请求到免费的herokudns域名。

您需要有一个单独的服务器,例如nginx或httpd运行。我不确定是否有免费服务来托管代理,但通常当您注册域名时,您可能会获得一个附加的托管插件,或者人们已经可以访问加密主机,并且只想使用Heroku来运行他们的节点应用程序。

设置httpd代理看起来会像这样(来自https://serverfault.com/questions/84821/apache-proxypass-with-ssl):

<VirtualHost 1.2.3.4:80>
ServerName customdomain.com
SSLProxyEngine On
SSLProxyCheckPeerCN on
SSLProxyCheckPeerExpire on
ProxyPass / https://heroku-app-name.herokuapp.com
ProxyPassReverse / https://heroku-app-name.herokuapp.com
</VirtualHost>

这样你就可以全程加密了 :)


-1

这实际上是一个问题而不是答案。有人尝试过ZeroSSL吗?它提供免费的SSL,这里是Heroku的安装指南。然而,SSL Endpoint 显然已被弃用,并且不被Heroku推荐,它似乎是Heroku的付费插件。

$ cat example.crt ca_bundle.crt  certificate.crt

我无法理解帮助文档中的这一行。也许是缺少>符号?当我只有以下文件时,example.crt从哪里来?

  • certificate.crt
  • ca_bundle.crt
  • private.key

或者Heroku SSL可以接受由ZeroSSL颁发的SSL证书吗?


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