Получение бесплатного SSL сертификата Let's Encrypt

Thank you for reading this post, don't forget to subscribe!

Lets Encrypt - сер­ти­фи­ка­ци­он­ный центр, кото­рый выда­ет бес­плат­ные SSL (TLS) сер­ти­фи­ка­ты. Про­ект был под­дер­жан боль­шим чис­лом IT-ком­па­ний, в свя­зи с чем, выдан­ные сер­ти­фи­ка­ты под­дер­жи­ва­ют­ся мно­ги­ми опе­ра­ци­он­ны­ми систе­ма­ми (есть дове­рие к цен­тру сер­ти­фи­ка­ции). Нача­ло рабо­ты — декабрь 2015 года. Офи­ци­аль­ный сайт — letsencrypt.org.

Клю­чи выда­ют­ся сро­ком на 90 дней. Есть воз­мож­ность полу­чить сер­ти­фи­кат как в руч­ном режи­ме, так и авто­ма­ти­че­ском (с помо­щью ути­ли­ты certboot). Штат­но, про­цесс полу­че­ния реа­ли­зо­ван на систе­мах UNIX, а под Windows есть неофи­ци­аль­ная ути­ли­та, кото­рая так­же поз­во­лит полу­чить и/или обно­вить сер­ти­фи­кат. Во вре­мя уста­нов­ки сер­ти­фи­ка­та для доме­на, центр Let’s Encrypt про­ве­ря­ет, что мы явля­ем­ся леги­тим­ным вла­дель­цем послед­не­го — для это­го выпол­ня­ет­ся http-запрос к сге­не­ри­ро­ван­но­му фай­лу на нашем веб-сер­ве­ре и если он может обра­бо­тать такой запрос, зна­чит мы име­ем пра­во на исполь­зо­ва­ние домена.

Область при­ме­не­ния дан­ных сер­ти­фи­ка­тов такая же, как у плат­ных, напри­мер, для веб-сер­ве­ров Nginx и Apache или для поч­то­вой систе­мы. Одна­ко, нуж­но запра­ши­вать клю­чи для ука­зан­ных явно доме­нов (мож­но несколь­ко в одном сер­ти­фи­ка­те), в отли­чие от Wildcard (все поддомены).

На теку­щий момент накоп­ле­но мно­го поло­жи­тель­ных при­ме­ров исполь­зо­ва­ния дан­но­го сер­ти­фи­ка­та. По отзы­вам, из мину­сов отмечены:

  1. Малень­кий пери­од дей­ствия (хоро­шо, что есть воз­мож­ность авто­ма­ти­че­ско­го продления).
  2. Нет под­держ­ки поддоменов.
  3. Не рабо­та­ет для Ipv6.

Плю­сы:

  1. Бес­плат­но.
  2. Высо­кая сте­пень защиты.

Условия получения бесплатного сертификата от Let's Encrypt

Преж­де чем начать, необ­хо­ди­мо знать о неко­то­рых нюан­сах полу­че­ния сер­ти­фи­ка­та Let's Encrypt:

  • При запро­се выпол­ня­ет­ся про­вер­ка доме­на. Для это­го необходимо: 
    1. либо создать TXT-запись в DNS.
    2. либо под­нять веб-сер­вер, далее в его корне созда­ет­ся ката­лог .well-known, а в нем файл с про­из­воль­ным назва­ни­ем. После кор­не­вой центр отправ­ля­ет запрос сер­ве­ру на загруз­ку дан­но­го фай­ла и, в слу­чае успе­ха, выда­ет сер­ти­фи­ка­ты для ука­зан­но­го домен­но­го имени.
  • SSL-сер­ти­фи­кат выда­ет­ся на 90 дней, поэто­му необ­хо­ди­мо по рас­пи­са­нию запус­кать коман­ду на авто­ма­ти­че­ское про­дле­ние клю­ча. Когда про­хо­дит 60 дней после нача­ла исполь­зо­ва­ния ново­го сер­ти­фи­ка­та, центр Let's Encrypt может выдать новый.
  • Если выпол­нять запрос для доме­на 3 уров­ня и выше, он дол­жен прой­ти DNS про­вер­ку на всех уров­нях. Напри­мер, домен layer3.layer2.com дол­жен отве­чать на запро­сы как для layer3.layer2.com, так и для layer2.com.

Проверка домена

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

Настройка веб-сервера

Дан­ный спо­соб немно­го слож­нее для Linux (для Windows все настрой­ки дела­ет ути­ли­та авто­ма­ти­че­ски), но поз­во­ля­ет без про­блем настро­ить авто­ма­ти­че­ское продление.

Запра­ши­вать сер­ти­фи­кат Let's Encrypt про­ще все­го с веб-сер­ве­ра, на кото­ром запу­щен сайт для доме­на. Воз­мо­жен аль­тер­на­тив­ный вари­ант с мон­ти­ро­ва­ние сете­вой пап­ки, но его рас­смат­ри­вать не будем.

Linux

При­мер про­сто­го кон­фи­гу­ра­ци­он­но­го фай­ла для NGINX:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

* где test.ru — домен, для кото­ро­го рабо­та­ет сайт и для кото­ро­го мы будем запра­ши­вать сер­ти­фи­кат; /usr/share/nginx/html — путь по умол­ча­нию для nginx.

Если сер­вер уже исполь­зу­ет­ся для сай­та, в сек­цию server добавляем:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

* дан­ны­ми строч­ка­ми мы гово­рим, что для всех запро­сов после /.well-known необ­хо­ди­мо отда­вать скрип­ты из ката­ло­га /usr/share/nginx/htmlallow all предо­став­ля­ет доступ всем.

При необ­хо­ди­мо­сти выпол­нять про­вер­ку и исполь­зо­вать rewrite/return, добав­ля­ем что-то подобное:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

После про­ве­ря­ем кон­фи­гу­ра­цию и пере­за­пус­ка­ем nginx:

nginx -t

service nginx reload

С помощью записи в DNS

Дан­ный метод про­ще, опи­сан­но­го выше, но он поз­во­лит настро­ить авто­ма­ти­че­ское про­дле­ние сер­ти­фи­ка­та толь­ко для неко­то­рых DNS, для кото­рых есть отдель­ные certbot-пла­ги­ны. Поэто­му дан­ный спо­соб, в боль­шин­стве слу­ча­ев, будет удо­бен для про­ве­де­ния тестов.

У нас долж­на быть воз­мож­ность управ­ле­ния запи­ся­ми в DNS. На дан­ном эта­пе доста­точ­но про­сто зай­ти в панель управ­ле­ния DNS и перей­ти к эта­пу полу­че­ния сер­ти­фи­ка­та (ниже по тек­сту). Если домен новый и был толь­ко-что деле­ги­ро­ван на DNS, воз­мож­но, при­дет­ся подо­ждать, пока он не ста­нет досту­пен для всех сер­ве­ров DNS в гло­баль­ной сети.

Установка утилиты для получения сертификата

Certbot для Linux

на CentOS 7:

yum install certbot

на CentOS 6:

Созда­дим ката­лог, в кото­ром будет хра­нить­ся ути­ли­та и пере­хо­дим в него:

mkdir /opt/certbot

cd /opt/certbot

Загру­жа­ем ути­ли­ту и раз­ре­ша­ем ее запуск:

wget https://dl.eff.org/certbot-auto

chmod a+x ./certbot-auto

Для удоб­ства, дела­ем симлинк:

ln -s /opt/certbot/certbot-auto /opt/certbot/certbot

* при пер­вом запус­ке certbot он авто­ма­ти­че­ски пред­ло­жит доуста­но­вить необ­хо­ди­мые зависимости.

LetsEncrypt-Win-Simple для Windows

На сай­те GitHub ска­чи­ва­ем win-acme. Рас­па­ко­вы­ва­ем архив.

Первое получение сертификата

1. Если мы под­твер­жда­ем пра­во на домен при помо­щи веб-сер­ве­ра, выпол­ня­ем такую команду:

certbot certonly --webroot --agree-tos --email postmaster@test.ru --webroot-path /usr/share/nginx/html/ -d test.ru -d www.test.ru

* где для двух команд:

  • certonly — запрос ново­го сертификата;
  • manual — про­вер­ка доме­на вручную.
  • preferred-challenges — ука­зы­ва­ет метод про­вер­ки домена.
  • webroot — про­вер­ка будет выпол­нять­ся на осно­ве запро­са к кор­ню сайта;
  • agree-tos — даем согла­сие на лицен­зи­он­ное соглашение;
  • email — поч­то­вый адрес адми­ни­стра­то­ра домена;
  • webroot-path — ката­лог в систе­ме Linux, кото­рый явля­ет­ся кор­не­вым для сайта;
  • d — пере­чис­ле­ние доме­нов, для кото­рых запра­ши­ва­ем сертификат.

После успеш­но­го выпол­не­ния коман­ды, сер­ти­фи­ка­ты будут созда­ны в ката­ло­ге /etc/letsencrypt/archive/test.ru, а так­же сим­лин­ки на них в ката­ло­ге /etc/letsencrypt/live/test.ru. При настрой­ке при­ло­же­ний, сто­ит ука­зы­вать пути до сим­лин­ков, так как при обнов­ле­нии фай­лы в пер­вом ката­ло­ге будут менять­ся, во вто­ром — нет. Пуб­лич­ный ключ будет с име­нем cert.pem, а при­ват­ный — privkey.pem.

2. При под­твер­жде­нии пра­ва на домен с TXT-записью:

certbot certonly --manual --agree-tos --email postmaster@test.ru --preferred-challenges=dns -d test.ru -d www.test.ru

На запрос под­твер­жде­ния отве­ча­ем Y — систе­ма выдаст что-то на подобие:

Please deploy a DNS TXT record under the name
_acme-challenge.test.ru with the following value:

W2SC9b88y2j2oUjhxVgS7Bphph9g5PqhkBq9KiWkLTm

Once this is deployed,

* Дан­ное сооб­ще­ние гово­рит, что мы долж­ны создать TXT-запись _acme-challenge.test.ru со зна­че­ни­ем W2SC9b88y2j2oUjhxVgS7Bphph9g5PqhkBq9KiWkLTm.

Созда­ем соот­вет­ству­ю­щую запись в пане­ли управ­ле­ния DNS, и в кон­со­ли сер­ве­ра нажи­ма­ем Enter для про­дол­же­ния. Если, как в дан­ном при­ме­ре, мы запра­ши­ва­ем сер­ти­фи­кат для несколь­ких узлов, повто­ря­ем действия.

Автоматическое продление

Смот­рим пол­ный путь до скрип­та certbot:

which certbot

Откры­ва­ем на редак­ти­ро­ва­ние cron и добав­ля­ем следующее:

crontab -e

0 0 * * 1,4 /bin/certbot renew

* в дан­ном при­ме­ре про­вер­ка и про­дле­ние сер­ти­фи­ка­та будет выпол­нять­ся по поне­дель­ни­кам и чет­вер­гам (1,4) в 00:00. /bin/certbot — путь, кото­рый мне выда­ла коман­да which certbot.

Коман­да certbot renew про­ве­ря­ет для всех наших сер­ти­фи­ка­тов срок окон­ча­ния, и если оста­лось менее 30 дней, запра­ши­ва­ет новый, сохра­ня­ет его в ката­ло­ге /etc/letsencrypt/archive/<домен> и обнов­ля­ет симлинк.

Сто­ит иметь вви­ду, что мно­гие при­ло­же­ния, исполь­зу­ю­щие сер­ти­фи­кат, потре­бу­ют пере­за­пус­ка, что­бы пере­чи­тать его. Поэто­му хоро­шей иде­ей будет не про­сто обнов­лять сер­ти­фи­кат, но и пере­за­пус­кать сер­вис, кото­рый исполь­зу­ет сер­ти­фи­кат. Напри­мер, для NGINX:

0 0 * * 1,4 /bin/certbot renew && systemctl restart nginx

Wildcard

С мар­та 2018 года появи­лась воз­мож­ность полу­чить бес­плат­ный сер­ти­фи­кат на все под­до­ме­ны, напри­мер, mail.test.ru, test.test.ru, admin.test.ru (*.test.ru).

Особенности получения Wildcard от Let's Encrypt:

  1. Под­твер­дить пра­во исполь­зо­ва­ния доме­ном мож­но толь­ко с помо­щью DNS — таким обра­зом, затруд­ня­ет­ся про­цесс авто­ма­ти­че­ско­го про­дле­ния. Нуж­но исполь­зо­вать пла­ги­ны, кото­рые поз­во­ля­ют авто­ма­ти­че­ски созда­вать нуж­ную запись на DNS, но они доступ­ны дале­ко не для всех постав­щи­ков услуг DNS. В про­тив­ном слу­чае, обнов­лять Wildcard нуж­но вручную.
    Так­же, неко­то­рые пане­ли управ­ле­ния хостин­гом, напри­мер ISP Manager с вер­сии 5 могут управ­лять про­цес­сом полу­че­ния Wildcard от Let's Encrypt с воз­мож­но­стью авто­ма­ти­че­ско­го про­дле­ния (но необ­хо­ди­мо, что­бы домен обслу­жи­вал­ся на дан­ном хостинге).
  2. Вре­мя дей­ствия сер­ти­фи­ка­та так­же огра­ни­че­на 3 месяцами.

Certbot

Необ­хо­ди­мо, что­бы вер­сия ути­ли­ты certbot была 0.22.0 и выше. Про­ве­рить теку­щую вер­сию мож­но командой:

certbot --version

… если вер­сия ниже, обнов­ля­ем ее командами:

для CentOS / Red Hat:

yum update certbot

Процесс получения

Про­цесс очень похож на про­цесс полу­че­ния сер­ти­фи­ка­та с под­твер­жде­ни­ем доме­на в DNS.

Вво­дим команду:

certbot certonly --manual --agree-tos --email master@test.ru --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges=dns -d test.ru -d *.test.ru

* обра­тим вни­ма­ние на 2 дета­ли: 1) мы доба­ви­ли опцию server, что­бы ука­зать, на каком сер­ве­ре Let's Encrypt долж­на про­хо­дить про­вер­ка DNS; 2) мы полу­ча­ем сер­ти­фи­кат как для *.test.ru, так и само­го test.ru, так как пер­вое не вклю­ча­ет второго.

… систе­ма попро­сит создать TXT-запись в DNS, кото­рый обслу­жи­ва­ет наш домен:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

* в дан­ном при­ме­ре систе­ма попро­си­ла создать TXT-запись _acme-challenge.test.ru со зна­че­ни­ем DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI.

Захо­дим в панель управ­ле­ния DNS и созда­ем нуж­ную запись. Если у нас свой сер­вер DNS, напри­мер, bind, то стро­ка будет такой:

; TXT
_acme-challenge IN      TXT     DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI

Не торо­пим­ся нажи­мать Enter — после настрой­ки DNS нуж­но немно­го вре­ме­ни (пару минут), что­бы настрой­ка при­ме­ни­лась. Про­ве­рить появ­ле­ние запи­си мож­но коман­дой с рабо­че­го компьютера:

nslookup -type=txt _acme-challenge.test.ru 8.8.8.8

Как толь­ко видим, что настрой­ки при­ме­ни­лись, нажи­ма­ем Enter — если это наш пер­вый запрос Wildcard для дан­но­го доме­на, то систе­ма нас попро­сит создать еще одну запись — повто­ря­ем про­це­ду­ру, создав в DNS вто­рую запись TXT.

Если все сде­ла­ли пра­виль­но, то увидим:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

сер­ти­фи­кат получен.

Также можно воспользоваться сервисом:
https://certbot.eff.org/