如何在 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:update
。sudo 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 上对我不起作用.. 安装/运行 certbotsu: 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/Express/Socket.io 应用程序时出现应用程序错误