Тема получения сертификата Let's Encrypt уже подымалась на хабре (см. тут), да и в сети можно найти много рецептов разного качества.

Читал я и ужасался: одни пишут, что то нужно nginx или apache остановить («на пару минуточек всего»), другие предлагают файлы подкладывать в папку веб-сервера (в соседней ssh-сессии), третьи — о том, как важно соблюсти правильный Content-type для файлов проверки домена…

Давайте попробуем обойтись без всего этого: чтобы не было мучительно больно ни на стадии установки, ни очередном продлении — даже если придётся обновлять сразу много доменов. Собственно, вот и вся цель моей небольшой заметки: это не пошаговый степ-бай-степ, не длинная теоретическая статья о том, как функционирует Let's Encrypt — просто описывается правильный на мой взгляд подход, который будет правилен для конфигурации любой сложности.

Вся суть в двух словах: пусть Let's Encrypt запустит веб-сервер на 9999 порту, а мы допишем конфиг nginx, чтобы он пробросил запрос на этот бекенд. Кому интересны детали — прошу под кат

Установка Let's Encrypt в настоящее время рекомендуется из репозитория на гитхабе:

git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt


Для некоторых операционок уже есть готовые пакеты (более того — вместо команды letsencrypt-auto (которая по сути есть лишь обёртка для letsencrypt) можно использовать letsencrypt), но установка из репозитория меня, как программиста вполне устраивает.

Далее — нужно подготовить наш сервер.

В принципе, всё, что от нас требуется — это чтобы по адресу mysubdomain.mydomain.tld/.well-known/acme-challenge/6il4rb2ErDWuBnUsTw_qrJc_tXGNv43p2a4kQQc0CvE отдавался заранее определённый контент с нужными заголовками.

Переложим эту работу на сам Let's Encrypt: пусть сам подымет на 127.0.0.1:9999 собственный веб-сервер, а мы — лишь допишем в конфиг nginx правило для проброса запросов на этот бекенд. Не нужно ни останавливать ничего, ни тем более создавать файлы вручную.

Итак. Создаём файл /etc/nginx/template/letsencrypt.conf следующего вида:

location ~ ^/(.well-known/acme-challenge/.*)$ {
    proxy_pass http://127.0.0.1:9999/$1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}


И подключим в конфиг-файлы нужных поддоменов:

     include template/letsencrypt.conf;


Собственно, это всё. Дальше можно запустить одну-единственную команду — собственно запустить Let's encrypt:

letsencrypt-auto --agree-tos --renew-by-default --standalone --standalone-supported-challenges http-01 --http-01-port 9999 --server https://acme-v01.api.letsencrypt.org/directory certonly -d mydomain.tld -d www.mydomain.tld -d i1.mydomain.tld -d i2.mydomain.tld


Здесь я получаю сертификат сразу для четырёх поддоменов, указываю, что нужно запустить веб-сервер на порту 9999, согласиться с лицензионным соглашением. (В принципе, можно указать в командной строке е-мейл, чтобы вообще не пришлось в интерактивный режим входить и довносить эту информацию: читайте описание ключей в документации)

В принципе, больше описывать нечего. Как внести сертификат в конфиг-файл nginx достаточно хороших и правильных описаний.

Единственное — осталось добавить в cron команду автоматического продления:

letsencrypt renew >> /dev/null 2>&1


В getting-started приведены другие примеры скриптов обновления, рекомендую посмотреть: можно предусмотреть допустим отправку письма в случае, если обновление закончилось неудачей или автоматически рестартовать демон веб-сервера.

Вот и всё. От себя добавлю, что очень не люблю быть в первых рядах новой технологии («пока не выйдет первый сервис-пак — нет смысла обновлять винду на новую»), но в принципе, вижу, что Let's Encrypt уже можно потихоньку начинать использовать в продакшн.

PS В качестве основы для своей заметки я взял статью Дмитрия из его блога. Не знаю, есть ли он на хабре, в любом случае от меня — большое спасибо.

Комментарии (14)


  1. Aiditz
    20.03.2016 20:24
    +10

    Но можно еще проще. Не нужно поднимать сервер на 9999 порту, достаточно указать letsencrypt'у, в какой папке будет лежать файл. Конфиг nginx:

    location /.well-known/acme-challenge {
    root /var/www/letsencrypt/;
    }

    Генерация сертфиката:

    ./letsencrypt-auto certonly --webroot -w /var/www/letsencrypt -d domain.com


    1. questor
      20.03.2016 20:35

      Тоже неплохой вариант. Вообще, под nginx есть уже и плагин, только на сайте он числится как глубоко экспериментальный. Думаю, что через год запрос сертификата будет действительно намного проще чем сейчас.


    1. MrJeos
      20.03.2016 20:39
      +3

      Так можно делать даже без правки конфига, если указать папку самого сайта, а не отдельную для letsencrypt.


      1. Aiditz
        20.03.2016 20:49
        +1

        Не всегда у сайта есть public-директория.

        Другой минус: нужно для каждого сайта помнить и указывать путь к public-папке.

        А добавить include letsencrypt.conf — универсальный вариант, работающий при любой конфигурации.


        1. MrJeos
          20.03.2016 21:22

          Этот include надо ведь прописать в каждой секции server, верно?


          1. Aiditz
            21.03.2016 19:00

            Я прописывал в каждой, но может быть можно как-то от этого уйти — я не разбирался, т.к. у меня доменов немного.


      1. inkvizitor68sl
        20.03.2016 21:17
        -2

        Так sudo понадобится, как раз.


  1. jehy
    21.03.2016 09:57
    -9

    Только упустили, что получать надо сертификат не у let's encrypt, а у wosign. Провайдер один и тот же, зато на два года, а не на год.


    1. jehy
      21.03.2016 10:01

      Кстати, вот прямо сегодняшний пост на эту тему.


    1. wait
      21.03.2016 10:15

      LE выдает сертификат на 90 дней. Автопродление рекомендуют каждые 60 дней.


    1. rshadow
      21.03.2016 12:00
      +3

      Вы предлагаете заменить открытое, автоматизированное, правильное решение на проприетарщину без плюсов, а только с минусами? Интересный подход. Наверно те кто привык к такой «халяве» еще долго будут ломать копья и бегать за скидками =(


      1. jehy
        21.03.2016 12:08
        -4

        Ну если вы готовы нести в продакшн автоматизированное обновление сертификатов, которое находится в бета версии, и рисковать раз в два месяца — флаг вам в руки.

        И считать let's encrypt более открытым, чем его создателей — это просто смешно. Вы так можете считать любое решение на основе API с github открытым. Или вы считаете, что кусок кода с гитхаба вам позволяет как-то отвязаться от центра сертификации?


        1. jehy
          21.03.2016 12:56
          -4

          Отдельный привет минусующим, которые видимо не знают, как работают SSL сертификаты и их получение. Жалко, конечно, что такой уровень аудитории.


        1. rshadow
          21.03.2016 16:48
          +2

          > которое находится в бета версии,

          Сегодня в бете, завтра нет. На некритичных ресурсах попробовал. Полгода — полет нормальный.

          > И считать let's encrypt более открытым, чем его создателей

          Это вы уже сами что-то выдумали. Я вижу открытый клиент. Я вижу людей, которые делают опенсорс и их стремление в правильном направлении. Я прекрасно понимаю что private key нельзя выкладывать в опенсорс ;) Что еще надо?
          А вы предлагаете в качестве альтернативы закоренелых продавцов ?в?о?з?д?у?х?а? записей в БД. Снизошедших до простых смертных.