我在Heroku上运行了一个Node Express应用程序,我希望使用LetsEncrypt的免费SSL证书进行加密。但是,我看到的方法需要打开端口443和80以允许ACME进程工作。
Heroku只为您提供一个端口,并且不允许您选择哪个端口。那么我该如何使用LetsEncrypt?
昨天我花了很多时间搞清楚这一点。很久以来第一次在StackOverflow上找不到我想做的事情的答案!
答案 0 :(得分:18)
Heroku现在支持LetsEncrypt!因此,不再需要此解决方法。
这里的说明:
https://devcenter.heroku.com/articles/automated-certificate-management
对于新应用,您无需执行任何操作,默认情况下已启用此功能。
对于2017年3月21日之前创建的应用程序,您可以使用此Heroku cli命令将其打开:
heroku certs:auto:enable
谢谢@Spain Train
理想情况下,LetsEncrypt允许自动证书续订过程。这对Heroku来说更难做到,所以这个答案描述了如何使用手动过程。使用Heroku环境var,您可以非常轻松地手动更新证书 - 无需更改代码。
这个答案的信用很大程度上归功于两篇不错的博文:
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
将此中间件添加到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);
});
sudo certbot certonly --manual
sudo ls /etc/letsencrypt/live/www.example.com
查看文件是否存在。如果您的网站没有证书,请运行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
答案 1 :(得分: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键 - 让我们加密将检查TXT记录,签署证书,certbot
将保存它以便您上传到heroku。