如何在 Heroku Node Express 应用程序中使用 LetsEncrypt SSL 证书?

Posted

技术标签:

【中文标题】如何在 Heroku Node Express 应用程序中使用 LetsEncrypt SSL 证书?【英文标题】:How can I use a LetsEncrypt SSL cert in my Heroku Node Express app? 【发布时间】:2017-03-05 02:51:06 【问题描述】:

我有一个在 Heroku 上运行的 Node Express 应用程序,我想使用 LetsEncrypt 的免费 SSL 证书对其进行加密。但是,我看到的方法需要打开端口 443 和 80 以允许 ACME 进程工作。

Heroku 只给你一个端口,不让你选择哪个端口。那么如何使用 LetsEncrypt?

我昨天花了很多时间解决这个问题。很久以来第一次在 *** 上对我想做的事情没有答案!

【问题讨论】:

Heroku 现在拥有一流的自动化 Let's Encrypt 证书支持 - devcenter.heroku.com/articles/automated-certificate-management 这是个好消息!谢谢! 【参考方案1】:

更新:

Heroku 现在原生支持 LetsEncrypt!因此不再需要此解决方法。

这里的说明:

https://devcenter.heroku.com/articles/automated-certificate-management

对于新应用,您无需执行任何操作,默认情况下已开启。 对于 2017 年 3 月 21 日之前创建的应用程序,您可以使用以下 Heroku cli 命令将其打开: heroku certs:auto:enable

感谢@西班牙火车


背景

理想情况下,LetsEncrypt 允许自动证书更新过程。这在 Heroku 上更难做到,所以这个答案描述了如何使用手动过程。使用 Heroku 环境变量,您将能够相当容易地手动更新您的证书 - 无需更改代码。

这个答案的功劳主要归功于两个不错的博客文章: https://medium.com/@franxyzxyz/setting-up-free-https-with-heroku-ssl-and-lets-encrypt-80cf6eac108e#.67pjxutaw 和https://medium.com/should-designers-code/how-to-set-up-ssl-with-lets-encrypt-on-heroku-for-free-266c185630db#.ldr9wrg2j

有一个 GitHub 项目显然支持 Heroku 上的自动证书更新。试用后我会更新这个答案:https://github.com/dmathieu/sabayon

在 Heroku 上通过 Node Express 应用使用 LetsEncrypt

准备好 Express 服务器:

将此中间件添加到您的 Express 应用中。请务必在任何将 http 重定向到 https 的中间件之前添加它,因为此端点必须是 http。

// Read the Certbot response from an environment variable; we'll set this later:

const letsEncryptReponse = process.env.CERTBOT_RESPONSE;

// Return the Let's Encrypt certbot response:
app.get('/.well-known/acme-challenge/:content', function(req, res) 
  res.send(letsEncryptReponse);
);

使用 certbot 创建证书文件:

    启动 certbot: sudo certbot certonly --manual 出现提示时输入网站网址 (www.example.com) certbot 将以 格式显示挑战响应字符串 xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyy 让 CERTBOT 在此状态下等待。请勿按 Enter 键或退出键。 转到 Heroku 仪表板并查看应用设置:https://dashboard.heroku.com/apps/your-heroku-app-name/settings 在配置变量下,单击“显示配置变量” 编辑 CERTBOT_RESPONSE 变量的值以匹配步骤 a 中的挑战响应。 等待 heroku 应用重启。 通过访问测试设置 http://www.example.com/.well-known/acme-challenge/whatever 注意 HTTP,不是 HTTPS 它应该显示挑战响应字符串。如果发生这种情况,请继续下一步。如果没有,请在继续之前尽一切努力让该 URL 返回 CR 字符串,否则您将需要重复整个过程。 返回 Certbot 并按 Enter 继续。 如果一切按计划进行,certbot 将告诉您一切正常并显示创建的证书的位置。您将在下一步中使用此位置。请注意,由于操作系统权限,您可能无法检查文件夹的内容。如有疑问,请sudo ls /etc/letsencrypt/live/www.example.com 查看文件是否存在。

更新 Heroku 实例以使用新证书:

如果您的网站没有证书,请运行 heroku certs:add。如果更新,运行heroku certs:updatesudo heroku certs:update --app your-heroku-app-name /etc/letsencrypt/live/www.example.com/fullchain.pem /etc/letsencrypt/live/www.example.com/privkey.pem

【讨论】:

'添加这个中间件',真的是中间件还是只是一个端点? Express 中的一切都是中间件:expressjs.com/en/guide/using-middleware.html。假设在这种情况下,它是处理特定端点的中间件。 好问题 - 我不确定您是否需要保留该端点。我不认为你需要,虽然我没有尝试删除它。一旦你安装了证书,据我所知,没有任何机制会以某种方式使你的证书失效。 有windows解决方案吗? 工作就像一个魅力。谢谢。【参考方案2】:

您还可以使用 DNS 而不是 HTTP 来验证您的域所有权。

使用certbot,指定 DNS 作为您的首选挑战:

sudo certbot certonly --manual --preferred-challenges dns

经过几次提示后,certbot 会告诉您使用 DNS TXT 记录来验证您的域:

Please deploy a DNS TXT record under the name
_acme-challenge.www.codesy.io with the following value:

CxYdvM...5WvXR0

Once this is deployed,
Press ENTER to continue

您的域名注册商可能有自己的用于部署 TXT 记录的文档。执行此操作,然后返回 certbot 并按 ENTER - Let's Encrypt 将检查 TXT 记录,签署证书,certbot 将保存它以供您上传到 heroku。

见my detailed blog post for more。

【讨论】:

很高兴知道,谢谢!此选项的一个好处是它避免了测功机重新启动之一。 (使用我的方法时,设置 env var 时会重新启动,上传证书文件时会重新启动。)小缺点是该过程可能需要更长的时间,因为有时部署 DNS 记录可能需要 10-60 分钟。跨度> 它也很好,因为它适用于任何堆栈 - 节点、python、ruby、php 等等。 这在 Heroku 上对我不起作用.. 安装/运行 certbot su: must be run from a terminal 时出现错误 您在什么操作系统上运行 certbot?您不在 Heroku 上运行该命令 - 您在本地计算机上运行它以获取签名证书。查看我的博客文章了解更多详情。如果您仍然遇到问题,请为我的网站(从我的博客链接)提交一个 GitHub 问题。

以上是关于如何在 Heroku Node Express 应用程序中使用 LetsEncrypt SSL 证书?的主要内容,如果未能解决你的问题,请参考以下文章

将 Node、Express 和 MongoDB 服务器部署到 heroku

Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能

Heroku Node.js WebSocket 服务器

尝试在 Heroku 上部署 Node.js/Express/Socket.io 应用程序时出现应用程序错误

Node.JS、Express 和 Heroku - 如何处理 HTTP 和 HTTPS?

POST Node/Express 无法在 Safari 移动设备上运行