Как я могу использовать SSL-сертификат LetsEncrypt в моем приложении Heroku Node Express?

#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:

  1. Запустите certbot: sudo certbot certonly --manual
    Введите URL сайта при появлении запроса (www.example.com )
    certbot отобразит строку ответа на запрос в формате
    xxxxxxxxxxxxxxxxxxxxxxx.гггг
    ОСТАВЬТЕ CERTBOT В ОЖИДАНИИ В ЭТОМ СОСТОЯНИИ. Пока не нажимайте enter или exit.
  2. Перейдите на панель управления Heroku и просмотрите настройки приложения:
    https://dashboard.heroku.com/apps/your-heroku-app-name/settings
    В разделе «Переменные конфигурации» нажмите «Показать переменные конфигурации»
    Отредактируйте значение переменной CERTBOT_RESPONSE, чтобы оно соответствовало ответу на запрос из шага a.
  3. Дождитесь перезапуска приложения heroku.
  4. Протестируйте настройку, посетивhttp://www.example.com/.well-known/acme-challenge/whatever
    ОБРАТИТЕ ВНИМАНИЕ НА HTTP, а не HTTPS
    , в нем должна отображаться строка ответа на запрос. Если это произойдет, переходите к следующему шагу. Если нет, сделайте все возможное, чтобы этот URL вернул строку CR, прежде чем продолжить, или вам нужно будет повторить весь этот процесс.
  5. Вернитесь в 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 для моего сайта (ссылка из моего блога), если у вас все еще возникают проблемы.