Статья

Получение SSL сертификата с закрытым 80 портом на примере duckdns.org

Задача

Я был очень огорчен, когда мой интернет-провайдер закрыл все входящие соединения на 80 порту, якобы "по соображениям моей же безопасности". Отвалились Google Home, Алиса Яндекса и все, что связано с https протоколом. Был выход арендовать статический ip адрес, что не очень-то и хотелось. 

Решение

Способ получения сертификата у центра бесплатной сертификации Let's Encrypt методом проверки HTTP-01 описан тут. Нам же, так как у нас закрыт 80 порт провайдером, подойдет метод проверки/верификации, то что доменное имя принадлежит нам, DNS-01

Для начала нам нужно зарегистрировать домен на www.duckdns.org и настроить смену динамического ip адреса для него.

Авторизовываемся на сайте, к примеру, при помощью GitHub и добавляем свободный и понравившийся нам поддомен:

Также при регистрации на www.duckdns.org нам выдадут токен, который понадобится нам далее: 

Создадим bash скрипт, при помощью которого будем обновлять ip адрес для нашего домена, в случае его смены, в планировщике заданий, например, раз в 5 минут. Интервал можно задать любой. В данном случае, если у нас изменился ip адрес, он будет обновлен в течение 5 минут, но не более. Положим его в папку текущего пользователя: 

nano ~/duck.sh

#!/bin/bash ip=`wget -q -4 -O- http://icanhazip.com` token="YOU_TOKEN" domains="test121" for domain in `echo $domains` do curl https://duckdns.org/update/$domain/$token/$ip sleep 3 done

YOU_TOKEN  - полученный ранее токен;

test121 - наш поддомен, если их несколько, можно указать через пробел.

Настроем все это дело на выполнение по расписанию в планировщике заданий. Заметьте, все выполняем от текущего пользователя.

crontab -e

В конец добавим правило:

*/5 * * * * ~/duck.sh >/dev/null 2>&1

Далее установим пакет certbot для верификации домена и получения сертификата:

sudo apt-get install certbot

После выполним команду для верификации домена методом проверки DNS-01:

sudo certbot -d test121.duckdns.org --manual --preferred-challenges dns certonly

В процессе нужно ввести Y и нажать Enter:

Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Obtaining a new certificate Performing the following challenges: dns-01 challenge for test121.duckdns.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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. Are you OK with your IP being logged? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y

Далее мы увидем строку/значение ресурсной записи TXT типа, которую нам нужно будет указать в DNS:

VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.test121.duckdns.org with the following value: VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue

Сделать это можно, составив урл запрос и открыв его в браузере:

https://www.duckdns.org/update?domains=&token=[&verbose=true] https://www.duckdns.org/update?domains=test121.duckdns.org&token=4...9&txt=VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY&verbose=true

И в результате мы увидим в браузере:

OK VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY UPDATED

Теперь, если мы введем команду в новой консоле, мы увидим, что у нас появилась DNS TXT запись:

dig txt _acme-challenge.test121.duckdns.org

; <<>> DiG 9.10.6 <<>> txt _acme-challenge.test121.duckdns.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39052 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 0 ;; QUESTION SECTION: ;_acme-challenge.test121.duckdns.org. IN TXT ;; ANSWER SECTION: _acme-challenge.test121.duckdns.org. 59 IN TXT "VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY" ;; AUTHORITY SECTION:. 77786 IN NS d.root-servers.net.. 77786 IN NS l.root-servers.net.. 77786 IN NS m.root-servers.net.. 77786 IN NS g.root-servers.net.. 77786 IN NS j.root-servers.net.. 77786 IN NS e.root-servers.net.. 77786 IN NS i.root-servers.net.. 77786 IN NS a.root-servers.net.. 77786 IN NS c.root-servers.net.. 77786 IN NS k.root-servers.net.. 77786 IN NS f.root-servers.net.. 77786 IN NS b.root-servers.net.. 77786 IN NS h.root-servers.net. ;; Query time: 274 msec ;; SERVER: 192.168.2.1#53(192.168.2.1) ;; WHEN: Mon Mar 09 14:06:11 +08 2020 ;; MSG SIZE rcvd: 320

Вернемся в консоль, в которой мы выполняли команду certbot:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue

Нажмем Enter и увидим генерацию ssl сертификата:

Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/test121.duckdns.org/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/test121.duckdns.org/privkey.pem Your cert will expire on 2020-06-07. 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

Готово! У нас сгенерировались сертификат /etc/letsencrypt/live/test121.duckdns.org/fullchain.pem и ключ /etc/letsencrypt/live/test121.duckdns.org/privkey.pem.

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


Для тех кто пользется DDNS.org (Noip.com) внесение TXT в запись DNS только за отдельную плату. Я нашел еще способ обновления сертификатов.
У Let'ы encrypt есть способ верификации ALpine. Мне Ростелеком подрезал 80 порт на вход. Звонки в техподдержку не помогли, они даже не сознались в блокировке! Говорят с нашей стороны все в порядке.
Вот ссылка на Alpine клиент
https://github.com/acmesh-official/acme.sh">https://github.com/acmesh-offi...
В принципе все достаточно подробно описано.
Потребуется Linux и терминал.
И вот тут примеры запуска
https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert">https://github.com/acmesh-offi...

У меня то же ростелеком. Они не сразу признались что закрыли 80 порт, пока не попросил переключить меня на тех. поддержку.


Вернуться назад
Вернуться назад