#node.js #ssl #express #heroku #lets-encrypt
#node.js #ssl #экспресс #heroku #позволяет зашифровать
Вопрос:
На Heroku запущено приложение Node Express, которое я хочу зашифровать с помощью бесплатного SSL-сертификата от LetsEncrypt. Однако методы, которые я видел, требуют открытия портов 443 и 80, чтобы процесс ACME мог работать.
Heroku предоставляет вам только один порт и не позволяет выбрать, какой именно. Итак, как я могу использовать LetsEncrypt?
Вчера я потратил кучу времени на выяснение этого. Впервые за долгое время в StackOverflow не было ответов на то, что я пытался сделать!
Комментарии:
1. Heroku теперь имеет первоклассную поддержку автоматизированных сертификатов Let’s Encrypt — devcenter.heroku.com/articles/automated-certificate-management
2. Это отличные новости! Спасибо!
Ответ №1:
Обновить:
Heroku теперь поддерживает LetsEncrypt изначально! Таким образом, этот обходной путь больше не нужен.
Инструкции здесь:
https://devcenter.heroku.com/articles/automated-certificate-management
Для новых приложений вам не нужно ничего делать, оно включено по умолчанию. Для приложений, созданных до 21 марта 2017 года, вы можете включить его с помощью этой команды Heroku cli: heroku certs:auto:enable
Спасибо @Spain Train
Предыстория
В идеале 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
Использование LetsEncrypt в Heroku с приложением Node Express
Подготовьте сервер 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
Введите URL сайта при появлении запроса (www.example.com )
certbot отобразит строку ответа на запрос в формате
xxxxxxxxxxxxxxxxxxxxxxx.гггг
ОСТАВЬТЕ CERTBOT В ОЖИДАНИИ В ЭТОМ СОСТОЯНИИ. Пока не нажимайте enter или exit. - Перейдите на панель управления 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
Комментарии:
1. «Добавить это промежуточное программное обеспечение», это действительно промежуточное программное обеспечение или просто конечная точка?
2. Все в Express является промежуточным программным обеспечением: expressjs.com/en/guide/using-middleware.html . Допустим, в данном случае это промежуточное программное обеспечение, которое обрабатывает определенную конечную точку.
3. Хороший вопрос — я не уверен, нужно ли вам поддерживать эту конечную точку. Я не думаю , что вам это нужно, хотя я и не пытался его удалять. Насколько я знаю, после установки сертификата не существует механизма, который каким-либо образом аннулировал бы ваш сертификат.
4. существует ли решение для Windows?
5. Сработало как по волшебству. Спасибо.
Ответ №2:
Вы также можете подтвердить право собственности на свой домен, чтобы использовать Let’s Encrypt с DNS вместо HTTP.
С помощью certbot
укажите DNS в качестве предпочтительного вызова:
sudo certbot certonly --manual --preferred-challenges dns
После нескольких запросов certbot сообщит вам, что вам нужно удалить текстовую запись DNS для проверки вашего домена:
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
У вашего регистратора домена, вероятно, есть собственные документы для развертывания текстовой записи. Сделайте это, вернитесь к certbot
и нажмите ENTER — Let’s Encrypt проверит текстовую запись, подпишет сертификат и certbot
сохранит его для загрузки в heroku.
Смотрите мой подробный пост в блоге для получения дополнительной информации.
Комментарии:
1. Приятно знать, спасибо! Одним из преимуществ этой опции является то, что она позволяет избежать одного из перезапусков dyno. (При использовании моего метода происходит перезапуск при установке переменной env и еще один при загрузке файла сертификата.) Незначительным недостатком является то, что процесс может занять больше времени, поскольку развертывание записей DNS иногда может занимать 10-60 минут.
2. Это также приятно, потому что оно работает на любом стековом узле, python, ruby, php, любом другом.
3. у меня это не сработало на Heroku .. постоянно появлялись ошибки при установке / запуске certbot
su: must be run from a terminal
4. На какой ОС вы запускаете certbot? Вы не запускаете эту команду на Heroku — вы запускаете ее на своем локальном компьютере, чтобы получить подписанный сертификат. Проверьте мой пост в блоге для получения более подробной информации. И отправьте сообщение о проблеме на GitHub для моего сайта (ссылка из моего блога), если у вас все еще возникают проблемы.