Yet another инструкция по получению ssl-сертификата Let's Encrypt

    Тема получения сертификата 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-auto renew >> /dev/null 2>&1
    


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

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

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

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 15

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

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

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

      ./letsencrypt-auto certonly --webroot -w /var/www/letsencrypt -d domain.com
        0
        Тоже неплохой вариант. Вообще, под nginx есть уже и плагин, только на сайте он числится как глубоко экспериментальный. Думаю, что через год запрос сертификата будет действительно намного проще чем сейчас.
          +3
          Так можно делать даже без правки конфига, если указать папку самого сайта, а не отдельную для letsencrypt.
            +1
            Не всегда у сайта есть public-директория.

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

            А добавить include letsencrypt.conf — универсальный вариант, работающий при любой конфигурации.
              0
              Этот include надо ведь прописать в каждой секции server, верно?
                0
                Я прописывал в каждой, но может быть можно как-то от этого уйти — я не разбирался, т.к. у меня доменов немного.
              –2
              Так sudo понадобится, как раз.
            –9
            Только упустили, что получать надо сертификат не у let's encrypt, а у wosign. Провайдер один и тот же, зато на два года, а не на год.
              0
              Кстати, вот прямо сегодняшний пост на эту тему.
                0
                LE выдает сертификат на 90 дней. Автопродление рекомендуют каждые 60 дней.
                  +3
                  Вы предлагаете заменить открытое, автоматизированное, правильное решение на проприетарщину без плюсов, а только с минусами? Интересный подход. Наверно те кто привык к такой «халяве» еще долго будут ломать копья и бегать за скидками =(
                    –4
                    Ну если вы готовы нести в продакшн автоматизированное обновление сертификатов, которое находится в бета версии, и рисковать раз в два месяца — флаг вам в руки.

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

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

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

                        Это вы уже сами что-то выдумали. Я вижу открытый клиент. Я вижу людей, которые делают опенсорс и их стремление в правильном направлении. Я прекрасно понимаю что private key нельзя выкладывать в опенсорс ;) Что еще надо?
                        А вы предлагаете в качестве альтернативы закоренелых продавцов ̶в̶о̶з̶д̶у̶х̶а̶ записей в БД. Снизошедших до простых смертных.
                    0
                    Кому любопытно — вывод команды обновления что-то типа:
                    ./letsencrypt-auto renew
                    Checking for new version...
                    Upgrading letsencrypt-auto 0.4.2 to 0.6.0...
                    Replacing letsencrypt-auto...
                       cp -p ./letsencrypt-auto /tmp/tmp.JJSUcoV9xI/letsencrypt-auto.permission-clone
                       cp /tmp/tmp.JJSUcoV9xI/letsencrypt-auto /tmp/tmp.JJSUcoV9xI/letsencrypt-auto.permission-clone
                       mv -f /tmp/tmp.JJSUcoV9xI/letsencrypt-auto.permission-clone ./letsencrypt-auto
                    Creating virtual environment...
                    Installing Python packages...
                    Installation succeeded.
                    Requesting root privileges to run certbot...
                       /root/.local/share/letsencrypt/bin/letsencrypt renew
                    
                    -------------------------------------------------------------------------------
                    Processing /etc/letsencrypt/renewal/mydomain.tld.conf
                    -------------------------------------------------------------------------------
                    
                    -------------------------------------------------------------------------------
                    new certificate deployed without reload, fullchain is
                    /etc/letsencrypt/live/mydomain.tld/fullchain.pem
                    -------------------------------------------------------------------------------
                    
                    Congratulations, all renewals succeeded. The following certs have been renewed:
                      /etc/letsencrypt/live/mydomain.tld/fullchain.pem (success)
                    
                    

                    + Поправил в статье немного строчку запуска обновления.

                    Only users with full accounts can post comments. Log in, please.