Как сгенерировать сертификат letsencrypt
Let’s Encrypt: получение сертификата по шагам
В данной статье будет описан реальный способ получения сертификата от Let’s Encrypt в ручном режиме для его дальнейшей установки на веб-сервер Windows (IIS/Microsoft Azure) или Linux (полностью ручной режим). Из-за отсутствия официального клиента под Windows для генерации сертификата будет использоваться дистрибутив Linux.
В первые дни открытия заявок на бета-тестирование и было принято решение записаться и вот недавно пришло письмо, которое сообщает о том, что теперь программа ACME сгенерирует валидный сертификат для нашего домена.
Далее мы решили опубликовать статью с пошаговой инструкцией процесса, чтобы к моменту релиза вы уже смогли оперативно создать и начать пользоваться своим сертификатом.
Как это работает
Полное описание процесса доступно по этой ссылке.
Важно лишь знать, что для подтверждения владения доменом и успешной генерации сертификата нужно будет иметь доступ к записям DNS или к серверу куда ссылается A-запись, что вполне логично.
Смысл программного набора Automated Certificate Management Environment (ACME) (написан на Python) в том, чтобы автоматизировать генерацию и установку сертификата в Linux-окружении.
Существует неофициальный Windows-клиент с открытыми исходными кодами, который может генерировать и устанавливать сертификаты на Windows IIS и Amazon Web Services, но у нас была задача получить ключи и установить их вручную. Предлагаю любому желающему написать статью по работе с ним.
Процесс по шагам
Внимание: эта инструкция учит создавать сертификат в ручном режиме, существуют и более простые способы автоматической генерации и обновления сертификатов. Надеюсь, что скоро их опишут на этом ресурсе.
[11/01/17] Новый клиент CertBot
Небольшое обновление статьи в 2017 году.
Теперь можно установить CertBot и получить сертификат в ручном режиме.
1. Скачиванием дистрибутив
2. Установка прав на файл
chmod a+x certbot-auto
3. Запуск для получения сертификата в ручном режиме
4. Следуйте указаниям программы (подробнее смотрите в полной инструкции ниже с шага № 4).
Подробная инструкция (старый клиент — всё ещё работает)
Использовалась официальная инструкция.
Пользователи Linux могут использовать текст ниже как пример генерации сертификата в ручном режиме.
1. Запустите ваш любимый дистрибутив Linux (мы использовали Debian 8).
либо 2. Установите Git и выполните команды ниже:
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
или 2. Скачайте и распакуйте в папку данный архив и перейдите в эту папку
3. Запустите установку и генерацию с помощью
Вам будет предложено ввести электронную почту для восстановления в будущем.
Ключ -a manual позволит сгенерировать ключи в ручном режиме без их автоматической установки на веб-сервер.
4. Далее введите домены для которых вы хотите создать сертификаты
5. Подтвердите сохранение вашего адреса в логах Let’s Encrypt
6. Подтвердите владение доменом
В сентябре 2016 года произошли небольшие изменения в порядке получения сертификата. Спасибо toxi_roman за обновление.
Это один из ответственных моментов в режиме ручной регистрации.
Обратите внимание: нас просят создать ответ на запрос, который возвращает Content-Type text/plain.
Такой ответ не пройдёт и подтверждение выдаст ошибку:
Нужно, чтобы было так:
7. После успешной проверки, будут созданы следующие сертификаты в папке /etc/letsencrypt/live/[имя домена]:
privkey.pem — приватный ключ для сертификата
Используется Apache для SSLCertificateKeyFile и nginx для ssl_certificate_key.
cert.pem (сертификат сервера)
Используется Apache для SSLCertificateFile.
chain.pem (сертификат цепочки)
Он же используется Apache для SSLCertificateChainFile.
fullchain.pem (соединение chain.pem и cert.pem)
Он же используется nginx для ssl_certificate.
7. Теперь пришло время сконвертировать его в родной для Windows .pfx формат.
Перейдите в папку /etc/letsencrypt/live/[имя домена] (откройте терминал в режиме администратора с помощью команды su):
cd /etc/letsencrypt/live/[имя домена]
Запустите OpenSSL с помощью команды:
и начните конвертацию с помощью команды:
Вас попросят ввести пароль и подтвердить его.
7.2 Выходим из OpenSSL с помощью команды quit
8. Мы получили сертификат mydomain.pfx, который теперь можем использовать в Windows-окружении.
Важно знать, что сертификаты Let’s Encrypt валидны 90 дней. Рекомендуется обновлять их каждые 60 дней. На электронную почту, которую вы указали для генерации, будут приходить уведомления об истечении сертификата.
Буду рад услышать ваши замечания или пожелания к статье.
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 в настоящее время рекомендуется из репозитория на гитхабе:
Для некоторых операционок уже есть готовые пакеты (более того — вместо команды 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 следующего вида:
И подключим в конфиг-файлы нужных поддоменов:
Собственно, это всё. Дальше можно запустить одну-единственную команду — собственно запустить Let’s encrypt:
Здесь я получаю сертификат сразу для четырёх поддоменов, указываю, что нужно запустить веб-сервер на порту 9999, согласиться с лицензионным соглашением. (В принципе, можно указать в командной строке е-мейл, чтобы вообще не пришлось в интерактивный режим входить и довносить эту информацию: читайте описание ключей в документации)
В принципе, больше описывать нечего. Как внести сертификат в конфиг-файл nginx достаточно хороших и правильных описаний.
Единственное — осталось добавить в cron команду автоматического продления:
В getting-started приведены другие примеры скриптов обновления, рекомендую посмотреть: можно предусмотреть допустим отправку письма в случае, если обновление закончилось неудачей или автоматически рестартовать демон веб-сервера.
Вот и всё. От себя добавлю, что очень не люблю быть в первых рядах новой технологии («пока не выйдет первый сервис-пак — нет смысла обновлять винду на новую»), но в принципе, вижу, что Let’s Encrypt уже можно потихоньку начинать использовать в продакшн.
PS В качестве основы для своей заметки я взял статью Дмитрия из его блога. Не знаю, есть ли он на хабре, в любом случае от меня — большое спасибо.
Получение бесплатного SSL сертификата Let’s Encrypt
Процесс в данной статье описан на примере систем Linux CentOS, Ubuntu (Debian) и Windows. Настройка выполняется в несколько шагов.
Условия получения бесплатного сертификата от Let’s Encrypt
Прежде чем начать, необходимо знать о некоторых нюансах получения сертификата Let’s Encrypt:
Проверка домена
Как было сказано выше, для получения бесплатного сертификата, Let’s Encrypt должен удостовериться, что мы являемся владельцем домена. Свое право на его владение мы можем подтвердить, создав специальную TXT-запись или настроив веб-сервис, который будет отвечать на запросы.
Настройка веб-сервера
Данный способ немного сложнее для Linux (для Windows все настройки делает утилита автоматически), но позволяет без проблем настроить автоматическое продление.
Запрашивать сертификат Let’s Encrypt проще всего с веб-сервера, на котором запущен сайт для домена. Возможен альтернативный вариант с монтирование сетевой папки, но его рассматривать не будем.
Linux NGINX
Пример простого конфигурационного файла для NGINX:
server <
listen 80;
server_name dmosk.ru;
root /usr/share/nginx/html;
>
* где dmosk.ru — домен, для которого работает сайт и для которого мы будем запрашивать сертификат; /usr/share/nginx/html — путь по умолчанию для nginx.
Если сервер уже используется для сайта, в секцию server добавляем:
/.well-known <
root /usr/share/nginx/html;
allow all;
>
* данными строчками мы говорим, что для всех запросов после /.well-known необходимо отдавать скрипты из каталога /usr/share/nginx/html; allow all предоставляет доступ всем.
При необходимости выполнять проверку и использовать rewrite/return, добавляем что-то подобное:
/.well-known) <
return 301 https://$host$request_uri;
>
После проверяем конфигурацию и перезапускаем nginx:
service nginx reload
Linux Apache
Создаем общий конфигурационный файл, в котором пропишем алиас.
б) для Ubuntu / Debian:
Со следующим содержимым:
Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
* в данном примере, запросы для страниц /.well-known/acme-challenge всех сайтов мы переводим в каталог /var/www/html/.well-known/acme-challenge.
Проверяем корректность конфигурационного файла:
И перезапускаем apache:
systemctl restart httpd || systemctl restart apache2
Windows
IIS должен отвечать на http-запрос до доменному имени, для которого мы планируем получить сертификат. Также в его настройках мы должны сделать привязку узла, для которого хотим получить сертификат к конкретному сайту. Для этого в консоли управления IIS раскрываем сайты и выбираем нужный нам (в данном примере, он всего один):
В меню справа кликаем по Привязки:
Изменяем привязку для имеющийся записи и, при необходимости, добавляем еще:
Применяем настройки и закрываем консоль управления IIS.
С помощью записи в DNS
Данный метод проще, описанного выше, но он позволит настроить автоматическое продление сертификата только для некоторых DNS, для которых есть отдельные certbot-плагины. Поэтому данный способ, в большинстве случаев, будет удобен для проведения тестов.
У нас должна быть возможность управления записями в DNS. На данном этапе достаточно просто зайти в панель управления DNS и перейти к этапу получения сертификата (ниже по тексту). Если домен новый и был только-что делегирован на DNS, возможно, придется подождать, пока он не станет доступен для всех серверов DNS в глобальной сети.
Установка утилиты для получения сертификата
Certbot для Linux
а) на CentOS 8:
б) на CentOS 7:
yum install certbot
в) на Ubuntu 16.04 и выше, а также Debian:
apt-get install certbot
г) на CentOS 6 или Ubuntu 14.04 / 12.04:
Создадим каталог, в котором будет храниться утилита и переходим в него:
Загружаем утилиту и разрешаем ее запуск:
Для удобства, делаем симлинк:
При первом запуске certbot он автоматически предложит доустановить необходимые зависимости — соглашаемся.
LetsEncrypt-Win-Simple для Windows
На сайте GitHub скачиваем win-acme pluggable для нужной разрядности операционной системы:
Раcпаковываем скачанный архив в любую папку.
Первое получение сертификата
Linux
1. Если мы подтверждаем право на домен при помощи веб-сервера, выполняем команду с таким синтаксисом:
а) Пример запроса при использовании веб-сервера NGINX:
б) Пример запроса при использовании веб-сервера Apache:
После успешного выполнения команды, сертификаты будут созданы в каталоге /etc/letsencrypt/archive/dmosk.ru, а также симлинки на них в каталоге /etc/letsencrypt/live/dmosk.ru. При настройке приложений, стоит указывать пути до симлинков, так как при обновлении файлы в первом каталоге будут меняться, во втором — нет. Публичный ключ будет с именем cert.pem, а приватный — privkey.pem.
2. При подтверждении права на домен с TXT-записью:
На запрос подтверждения отвечаем Y — система выдаст что-то на подобие:
Please deploy a DNS TXT record under the name
_acme-challenge.dmosk.ru with the following value:
Once this is deployed,
* Данное сообщение говорит, что мы должны создать TXT-запись _acme-challenge.dmosk.ru со значением W2SC9b88y2j2oUjhxVgS7Bphph9g5PqhkBq9KiWkLTm.
Создаем соответствующую запись в панели управления DNS, и в консоли сервера нажимаем Enter для продолжения. Если, как в данном примере, мы запрашиваем сертификат для нескольких узлов, повторяем действия.
Windows
Открываем командную строку от администратора и переходим в распакованный каталог. Например, если архив распакован на диск C, выполняем:
* где 2.1.6.773.x64 — моя версия утилиты.
Откроется меню с выбором действия — вводим N, чтобы создать новый сертификат:
Выбираем сайт в IIS, который отвечает на запросы нашего домена (в нашем случае, это единственный Default Web Site, то есть 1):
Если для сайта создано несколько привязок, выбираем 3, чтобы создать сертификаты для всех:
Вводим email адрес и подтверждаем корректность данных:
Утилита создаст необходимый каталог для проверки домена, запросит проверку, получит сертификат, добавит привязку к сайту по 443 порту с добавлением полученного сертификата и создаст в планировщике задание на автоматическое продление сертификата.
Автоматическое продление
Linux
Смотрим полный путь до скрипта certbot:
Открываем на редактирование cron и добавляем следующее:
а) для Ubuntu / Debian:
0 0 * * 1,4 /usr/bin/certbot renew
0 0 * * 1,4 /bin/certbot renew
* в данном примере проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00. /usr/bin/certbot или /bin/certbot — путь, который мне выдала команда which certbot.
Команда certbot renew проверяет для всех наших сертификатов срок окончания, и если осталось менее 30 дней, запрашивает новый, сохраняет его в каталоге /etc/letsencrypt/archive/ и обновляет симлинк.
Стоит иметь ввиду, что многие приложения, использующие сертификат, потребуют перезапуска, чтобы перечитать его. Поэтому хорошей идеей будет не просто обновлять сертификат, но и перезапускать сервис, который использует сертификат. Например, для NGINX:
0 0 * * 1,4 /bin/certbot renew && systemctl reload nginx
Windows
Настройка задания на автоматическое продление создается при получении сертификата. Проверить задание можно в планировщике заданий Windows:
Wildcard
С марта 2018 года появилась возможность получить бесплатный сертификат на все поддомены, например, mail.dmosk.ru, test.dmosk.ru, admin.dmosk.ru (*.dmosk.ru).
Особенности получения Wildcard от Let’s Encrypt:
Certbot
Необходимо, чтобы версия утилиты certbot была 0.22.0 и выше. Проверить текущую версию можно командой:
. если версия ниже, обновляем ее командами:
а) для CentOS / Red Hat:
yum update certbot
б) для Ubuntu / Debian:
Процесс получения
Процесс очень похож на процесс получения сертификата с подтверждением домена в DNS.
* обратим внимание на 2 детали: 1) мы добавили опцию server, чтобы указать, на каком сервере Let’s Encrypt должна проходить проверка DNS; 2) мы получаем сертификат как для *.dmosk.ru, так и самого dmosk.ru, так как первое не включает второго.
. система попросит создать TXT-запись в DNS, который обслуживает наш домен:
* в данном примере система попросила создать TXT-запись _acme-challenge.dmosk.ru со значением DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI.
Заходим в панель управления DNS и создаем нужную запись. Если у нас свой сервер DNS, например, bind, то строка будет такой:
; TXT
_acme-challenge IN TXT DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI
Не торопимся нажимать Enter — после настройки DNS нужно немного времени (пару минут), чтобы настройка применилась. Проверить появление записи можно командой с рабочего компьютера:
Как только видим, что настройки применились, нажимаем Enter — если это наш первый запрос Wildcard для данного домена, то система нас попросит создать еще одну запись — повторяем процедуру, создав в DNS вторую запись TXT.
Если все сделали правильно, то увидим:
IMPORTANT NOTES:
— Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/dmosk.ru/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/dmosk.ru/privkey.pem
Your cert will expire on 2019-09-05. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
«certbot renew»
— If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Возможные ошибки
Рассмотрим некоторые ошибки, с которыми мы можем столкнуться.
Missing command line flag or config entry for this setting
Ошибка появляется при попытке обновить сертификат для одного или нескольких доменов.
Решение:
Открываем конфигурационный файл для домена, например:
Находим опцию webroot_map (как правило, в самом низу). Либо она будет пустой, либо указывать на неправильный путь. Исправляем это:
* мы указываем домен и каталог, в котором будет создаваться проверочный файл.
Пробуем обновить сертификат.
ACMEv1 is deprecated and you can no longer get certificates from this endpoint
Ошибка появляется при попытке запросить или обновить сертификат. Полный текст ошибки:
Attempting to renew cert (xxx) from /etc/letsencrypt/renewal/xxx.conf produced an unexpected error: urn:acme:error:serverInternal :: The server experienced an internal error :: ACMEv1 is deprecated and you can no longer get certificates from this endpoint. Please use the ACMEv2 endpoint, you may need to update your ACME client software to do so. Visit https://community.letsencrypt.org/t/end-of-life-plan-for-acmev1/88430/27 for more information.. Skipping.
Причина: утилита на компьютере устарела. Она пытается использовать API-портал ACMEv1, который больше не поддерживается.
Решение: обновляем утилиту certbot.
Как получить сертификат Let’s Encrypt
В последнее время забота о безопасности и приватности пользователей набирает обороты. Когда проектировался интернет и протокол HTTP, о таких понятиях не думали. Поэтому весь трафик, передаваемый между веб-сервером и пользователем по протоколу HTTP, может быть просмотрен кем угодно, кто находится на пути этого трафика, например провайдером или хакерами.
Поэтому был придуман протокол HTTPS, который позволяет шифровать трафик и таим образом обезопасить его от перехвата. Для шифрования используются SSL-сертификаты. Раньше эти сертификаты стояли денег, но благодаря компании Let’s Encrypt теперь любой веб-сайт может установить SSL-сертификат и настроить шифрование абсолютно бесплатно. В этой статье мы рассмотрим, как получить сертификат Let’s Encrypt с помощью официального клиента Certbot.
Получение сертификата Let’s Encrypt
Вообще, нам не обязательно использовать именно Certbot, мы могли бы создать сертификат в OpenSSL, а затем просто подписать его с помощью ACME API от Let’s Encrypt. Но к этому API надо выполнять запросы в формате JSON, что очень неудобно делать из командной строки, поэтому лучше использовать один из клиентов. Например Certbot. К тому же, большинство клиентов ACME уже включают автоматическую генерацию сертификата в OpenSSL.
1. Синтаксис и команды Certbot
Прежде чем перейти к работе, давайте рассмотрим синтаксис утилиты Certbot и её команды. Они выглядят достаточно просто:
Команды используются для того, чтобы сообщить утилите, что именно надо сделать. Вот основные из них:
Как видите, команд не так много, и теперь вы в них точно не запутаетесь, а теперь разберём основные опции:
Теперь мы готовы к тому, чтобы перейти к работе с утилитой. Сначала установим её.
2. Установка Certbot
Сначала необходимо установить утилиту Certbot. Это официальный клиент, и он есть в репозиториях большинства дистрибутивов. Установка Certbot в Ubuntu выполняется из PPA:
sudo apt install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot
Если вы знаете, для какой платформы будут генерироваться сертификаты, то можно установить отдельные расширения для них, они позволяют автоматически редактировать конфигурацию. Например, вы можете установить модуль для apache или nginx:
sudo apt install python-certbot-apache
sudo apt install python-certbot-nginx
Эти плагины нужны, если вы собираетесь использовать соответствующие опции для автоматической установки.
3. Создание сертификата без установки
Если вам нужен сертификат для веб-сервера, который не поддерживается программой, вам придётся устанавливать его вручную. Получить такой сертификат можно с помощью команды certonly:
Эта команда получает сертификат для доменов test.losst.ru и www.test.losst.ru. Файлы для подтверждения аутентификации будут размещены в каталоге /var/www/example/. Также вы можете использовать встроенный веб-сервер для аутентификации:
Во время генерации сертификата утилита спросит ваш Email-адрес для аккаунта ACME, на который будут приходить уведомления о необходимости продления и другая информация:
Затем вам предложат подтвердить, что вы прочитали правила использования сервиса, ответьте А:
Далее вас спросят, хотите ли вы сделать ваш Email публичным:
Только после этого начнётся получение сертификата. Если всё прошло успешно, то ваш сертификат будет сохранён в /etc/letsencrypt/live/имя_домена/, оттуда вы уже можете использовать их в своих приложениях. Если же возникли ошибки, то утилита сообщит об этом.
4. Создание сертификата для Nginx
Вам не обязательно вручную устанавливать сертификаты, вы можете использовать один из доступных плагинов для автоматического обновления конфигурации. Например, рассмотрим использование плагина для Nginx:
Дополнительные параметры задавать не надо, потому что утилита сама прочитает конфигурацию и выведет список доступных доменов:
Введите цифру нужного домена или несколько цифр, разделённых запятой. Утилита сама установит всё, что нужно, а затем спросит вас, нужно ли перенаправлять http-трафик на https:
Затем утилита выдаст ту же информацию, что и в предыдущем варианте:
5. Обновление сертификата Let’s Encrypt
Чтобы выполнить обновление сертификата Let’s Encrypt, достаточно запустить команду certbot с опцией certonly. Учитывая, что сертификат находится в папке certbot, а конфигурация веб-сервера настроена именно на эту папку, то этой операции достаточно. Если же сертификаты копируются в другую папку, то вам понадобится скрипт для их автоматического копирования после обновления.
Если срок службы сертификата ещё не вышел и обновление не требуется, утилита спросит вас, действительно ли это надо сделать.
Если вы хотите обновлять сертификат в не интерактивном режиме, например с помощью скрипта, то нужно использовать опцию -n, также при использовании этой опции надо передать плагин, который будет использоваться для аутентификации:
Теперь можно добавить эту команду в планировщик cron, например раз в неделю:
Если вы хотите обновить сертификаты для всех доменов одной командной в не интерактивном режиме, достаточно выполнить команду:
sudo certbot renew
6. Получение Wildcard сертификата Let’s Encrypt
Вы можете сделать это вручную или же использовать dns-плагин для Certbot, чтобы добавить её автоматически. Правда, плагин поддерживается только для популярных сервисов, таких, как DigitalOcean, Linode, Cloudflare и так далее. В этой статье рассмотрим ручной вариант. Команда для генерации сертификата будет выглядеть вот так:
Вам надо будет разрешить публикацию вашего IP-адреса, а потом добавить TXT-запись с нужным именем и значением к вашей доменной зоне. В моем случае это _acme-challenge.test.losst.ru со специальным хэшем:
Нужная TXT-запись в службе dmains.webmoney.ru выглядит вот так:
На обновление доменной зоны может уйти несколько часов, поэтому команду придётся выполнить ещё пару раз позже. После генерации сертификата вы можете использовать его как обычный сертификат для всех поддерживаемых доменов.