Всем привет, сегодня я хотел бы вам рассказать, как просто(а главное бесплатно) получить криптографический сертификат X.509. Для этого нам понадобиться Let's Encrypt и командная оболочка bash(я использую встроенную в win10 оболочку ubuntu).
Let's Encrypt - центр сертификации, начавший свою работу в 2015 году. Проект не является коммерческим и неподконтролен конкретной организации. Его преимуществами является:
- Бесплатность - любой владелец доменного имени может получить сертификат бесплатно.
- Автоматизированность - Let's Encrypt предоставляет клиент, который, после настройки, может автоматически обновлять ваши сертификаты на сервере.
Краткая инструкцияДля начала нам необходимо скачать cert-bot.
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
Запускаем cert-bot.
./certbot-auto certonly --authenticator manual
Далее нас попросят ввести наши доменные имена, для примера возьмем мой блог, это - www.cyberdeveloper.pro. Домены необходимо разделить пробелами. После ввода всех доменных имен бот вывалит такую заметку.
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.
Нужно подтвердить сохранение вашего IP-адреса в логах Let's Encrypt. Следующим шагом станет подтверждение домена. Предлагаю рассмотреть это подробней, как самую интересную часть.
Подтверждение домена
На этом шаге бот просит подтвердить владение доменом.
Make sure your web server displays the following content at
http://cyberdeveloper.pro/.well-known/acme-challenge/-kWeTRa18zXm6JnRJ0a9tW_j4WB4wYgvxELytdePneg before continuing:
-kWeTRa18zXm6JnRJ0a9tW_j4WB4wYgvxELytdePneg.ER-RTUz3C_RSwHzgCKb7DFvRc3N6rNrPxkyG5KvAO5c
If you don't have HTTP server configured, you can run the following
command on the target server (as root):
mkdir -p /tmp/certbot/public_html/.well-known/acme-challenge
cd /tmp/certbot/public_html
printf "%s" -kWeTRa18zXm6JnRJ0a9tW_j4WB4wYgvxELytdePneg.ER-RTUz3C_RSwHzgCKb7DFvRc3N6rNrPxkyG5KvAO5c > .well-known/acme-challenge/-kWeTRa18zXm6JnRJ0a9tW_j4WB4wYgvxELytdePneg
# run only once per server:
$(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"
Бот генерирует пару ключей и начинает взаимодействие с Let's Encrypt CA. Тот, в свою очередь, сообщает что нужно сделать, чтобы подтвердить владение доменом.

В нашем случае Let's Encrypt CA вернул путь, значение, которое должен вернуть наш сервер и случайное число(nonce). После того как мы выполнили задание, бот подписывает случайное число своим приватным ключом(это докажет, что он контролирует пару ключей) и уведомляет Let's Encrypt CA, что можно завершить проверку. Let's Encrypt CA, в свою очередь, проверяет подпись на nonce, пытается загрузить файл с нашего сервера и убеждается, что он содержит соответствующий контент.

Если все прошло успешно, то бот связывается с публичным ключом и считается уполномоченным управлять сертификатами для наших доменов. В конце этого шага по пути /etc/letsencrypt/live/cyberdeveloper.pro/ будут лежать следующие файлы:
- privkey.pem - приватный ключ сертификата.
- cert.pem - сертификат сервера.
- chain.pem - промежуточный сертификат.
- fullchain.pem - конкатенация chain.pem и cert.pem.
Эти файлы являются итогом нашей работы, после которой следует настройка сервера, но это уже тема отдельной статьи. В моем случае, мне только пришлось через веб форму отправить эти файлы в RU-CENTER.
Автоматизация
В примере выше мы воспользовались ручным вариантом, но cert-bot имеет несколько других ключей. Например команда
./certbot-auto certonly --webroot --agree-tos --email example@domain.com -w /var/www/example/ -d example.com -d www.example.com
автоматически сгенерирует сертификат для двух доменов, останется сказать, например nginx, где они лежат.
Нужно помнить, что сертификаты валидны всего 90 дней. Последняя команда на сегодня - выполняет обновление сертификатов.
./certbot-auto renew --quiet --no-self-upgrade
Ее необходимо добавить в cron и забыть.
В этом посте мы разобрались как получить криптографический сертификат без лишней боли в организме и автоматизировали его обновление.
Тут можно прочитать, как используется этот сертификат в рамках протокола TLS. А здесь вы найдете более простое описание зачем они вообще нужны и как работают.
Если вам нравятся мои статьи, можете следить за обновлениями с помощью E-Mail, Twitter, Facebook, а также канала в Telegram.