Подтвердить что ты не робот

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

У меня есть приложение Node Express, работающее на Heroku, которое я хочу зашифровать с помощью бесплатного SSL-сертификата от LetsEncrypt. Однако методы, которые я видел, требуют открытия портов 443 и 80, чтобы разрешить работу ACME.

Heroku предоставляет только один порт и не позволяет вам выбирать порт. Итак, как я могу использовать LetsEncrypt?

Я потратил кучу времени, выясняя это вчера. Впервые за долгое время на StackOverflow не было ответов на то, что я пытался сделать!

4b9b3361

Ответ 1

Обновление:

Heroku теперь поддерживает LetsEncrypt изначально! Поэтому это обходное решение больше не требуется.

Инструкции здесь:

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

Для новых приложений вам не нужно ничего делать, он включается по умолчанию. Для приложений, созданных до 21 марта 2017 года, вы можете включить его с помощью этой команды Heroku cli: heroku certs:auto:enable

Спасибо @Spain Train


Фон

В идеале LetsEncrypt позволяет автоматизировать процесс продления сертификата. Это сложнее сделать на Heroku, поэтому в этом ответе описывается, как использовать ручной процесс. Используя среду var 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. Обязательно добавьте его перед любым промежуточным программным обеспечением, которое перенаправляет 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 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 отобразит строку ответа на вызов в формате
    xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyy
    ОСТАВЛЯЙТЕ КЕРТБОТ, ОЖИДАЕМЫЙ В ЭТОМ СОСТОЯНИИ. Не нажимайте еще раз, чтобы войти или выйти.
  • Перейдите на панель инструментов Heroku и просмотрите настройки приложения:
    https://dashboard.heroku.com/apps/your-heroku-app-name/settings
    В разделе "Конфигурируемые переменные" нажмите "Отобразить конфигурации Vars"
    Измените значение переменной CERTBOT_RESPONSE в соответствии с ответом на вызов с шага a.
  • Подождите, пока приложение heroku перезагрузится.
  • Проверьте настройки, посетив http://www.example.com/.well-known/acme-challenge/whatever
    ПРИМЕЧАНИЕ HTTP, а не HTTPS
    Он должен отображать строку ответа на вызов. Если это произойдет, перейдите к следующему шагу. Если нет, сделайте все возможное, чтобы получить этот URL, чтобы вернуть строку CR перед продолжением, или вам нужно будет повторить весь этот процесс.
  • Вернитесь к Certbot и нажмите Enter для продолжения.
    Если все пойдет так, как планировалось, certbot сообщит вам, что все работает, и отображает местоположение созданных сертификатов. Вы будете использовать это местоположение на следующем шаге. Обратите внимание, что вы не сможете проверить содержимое папки из-за os-разрешений. Если есть сомнения, 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

Ответ 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 Encrypt проверит запись TXT, подпишет сертификат и certbot сохранит ее для загрузки на герою.

Смотрите мое подробное сообщение в блоге для более.