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

09 марта 2020, 10:42

Задача

Я был очень огорчен, когда мой интернет-провайдер закрыл все входящие соединения на 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={YOURVALUE}&token={YOURVALUE}[&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.


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @Soprut

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

    • Artem Tomshin (tweaker3)
      Artem Tomshin (tweaker3) 26 дней назад

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

К списку статей

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома
15 ноября 2018, 09:42
Способы автоматизации механических ворот
15 июня 2018, 12:13
Охранная система в гараж на ESP8266 с интеграцией в Apple HomeKit
24 августа 2018, 12:18
Пошаговая установка HomeAssistant
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
27 августа 2018, 10:14
Интегрируем ХА в HomeKit
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.
01 ноября 2018, 09:27
Настройка Deconz USB стика ConBee от Dresden Elektronik в Hass.io и некоторые особенности эксплуатации
18 февраля 2020, 17:06
В данной статье описывается сборка слаботочного эл. щита на базе Wiren Board 6, а так же силового щита для небольшой квартиры.
11 мая 2019, 19:57
Как активировать русский язык в Google Assistant для Google Home