Pull to refresh

Comments 18

Для начала, оригинальная статья от 2018 года и на тот момент, LE был "революционно новым" ... с точки зрения автора. Можно было бы как-то вычитать статью перед публикацией?

Как видите, это не так уж и сложно.

Сначала мы присвоили каждому устройству (так называемому внутреннему серверу) публичное доменное имя, используя наш собственный динамический DNS-сервер и выделенную зону DNS. Используя домен, назначенный серверу (здесь: xi8qz.example.com), мы затем использовали предложение бесплатного сертификата Let's Encrypt и их запрос DNS, чтобы выпустить сертификат для этого сервера.

tl;dr Слишком сложно и много немотированного мазохизма...

Буквально как вот вчера занимался похожим: надо было наладить HTTPS по внутренней сетке, создав свои сертификаты и подписав их своим же trustable certificate authority.
На самом деле все куда проще, чем предлагает автор этой оригинальной статьи.

  1. Cтавим easy-rsa согласно гуглегайдам.
    Тут нет ничего сложного:
    apt install easy-rsa
    mkdir ~/easy-rsa
    ln -s /usr/share/easy-rsa/* ~/easy-rsa/
    cd ~/easy-rsa


    nano vars

    set_var EASYRSA_REQ_COUNTRY "XX"
    set_var EASYRSA_REQ_PROVINCE "Localhost"
    set_var EASYRSA_REQ_CITY "Localhost"
    set_var EASYRSA_REQ_ORG "Localhost"
    set_var EASYRSA_REQ_EMAIL "admin@localhost"
    set_var EASYRSA_REQ_OU "internal"
    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"

    затем

    ./easyrsa init-pki


  2. Генерим свой CA сертфикат:

    ./easyrsa build-ca nopass

    и кладем в /usr/share/ca-certifactes:

    cp ~/easy-rsa/pki/ca.crt /usr/share/ca-certifactes/

    далее запускаем:

    dpkg-reconfigure ca-certificates

    (для Debian, Ubuntu)

    хотя гайды говорят что надо запускать update-ca-certificates - но это все копи-пасты из одного источника без проверки результата.

  3. Далее делаем столько CSR'ов сколько необходимо сертификатов (в моем случае нужна была пачка из 12 сертификатов, я просто запустил в цикле список внутренних доменов:

    openssl req -new -newkey rsa:4096 -nodes -keyout example.com.key -out example.com.csr -subj /C=LO/ST=Localhost/L=Localhost/O=Localhost /OU=testonly/CN=*.example.com

    хинт: ничего не мешает сделать wildcard subdomain

  4. Импортируем CSRы в репо easy-rsa:

    ./easyrsa import-req CERT ALIAS

    где ALIAS - это некий алиас, например имя домена:

    ./easyrsa import-req /path/dir/example.com.csr example.com

  5. Если импорт прошел ок, подписываем серты своим CA:

    ./easyrsa sign-req server ALIAS

    где ALIAS - это алиас из предыдущего запуска

    все подписанные серты лежат в
    ~/easy-rsa/pki/issued

    и имеют название <ALIAS>.crt
    Кладем этот .crt + .key из п.3 в нужные места своих серверов.

  6. далее грузим ca.crt в /usr/share/ca-certificates всех своих серверов (которые под линуксом) и проделываем dpkg-reconfigure ca-certificates

  7. Для винды, если нужно чтобы браузер не орал о том, что он категорически не доверяет самодельному сертификату:

    win-R / mmc

    открывается microsoft managment console
    File - > Add/remove snap -ins

    в списке находим:
    "Certificates" - > double click -> выбираем "Computer Account" -> Next -> Local Computer -> Finish -> OK

    в MMC видим:

    Console Root
    > Certificates (Local computer)


    Тыц -> Раскрывается список :
    Trusted root certification authorites -> правая кнопка -> All tasks -> Import -> Next -> Browse (выбрать где лежит наш ca.crt) -> Next и тд.

  8. закрыть MMC (отменить сохранение). закрыть браузер(ы). Запустить браузер(ы). Теперь браузер обучен доверять самописному серту в пределах данного компьютера

  9. по дефолту: свой CA имеет срок 10 лет, самописный серт - 3 года. В отличии от LE, который надо будет обновлять с бубном каждые 3 месяца.

"революционно новым" убрал из текста. По посту - я как и ищу автоматизировать создание сертификатов LE для внутренних IP адресов

хотя гайды говорят что надо запускать update-ca-certificates - но это все копи-пасты из одного источника без проверки результата.

Использую update-ca-certificates на своих убунтах — всё отлично работает. Что с ним не так?

создав свои сертификаты и подписав их своим же trustable certificate authority

Хорошо, что это подошло вам, но все же это не прямая альтернатива Lets Encrypt, это просто обычная реализация своих сертификатов.

В отличии от LE, который надо будет обновлять с бубном каждые 3 месяца.

Серификат с коротким сроком действия безопаснее в случае его "угона", плюс побуждает настроить всё сразу автоматически, надёжно. Уж сколько было случаев, когда через несколько лет что-нибудь переставало работать, т.к. сертификат был подложен руками и его никто не отслеживал.

Хорошо, что это подошло вам, но все же это не прямая альтернатива Lets Encrypt, это просто обычная реализация своих сертификатов

Так непонятно какую задачу решает Lets Encrypt, чтобы под это искать альтернативу

Очень категорично заявили, поэтому спрошу: вы считаете, что раскладывать самопальные сертификаты на все новые клиентские устройства прям во всех случаях удобнее, чем получать валидные на серверы?

А корпоративные клиентские устройства, работающие во внутренней сети, не проходят предварительную настройку? Речь же не про публичный сервис

Даже не написали какой DNS-сервер используется, как настраивается доступ к API, и имеют ли все устройства один и тот же пароль/токен от API?

У меня глупый вопрос. А почему бы не использовать wildcard-сертификаты? Зачем генерить отдельно сертификаты для каждой машины в одном и том же домене, если можно получить один и раскатить на все машины?

Думаю можно использовать и wildcard-сертификаты. Оригинал поста старый. Думаю можно адаптировать.

У меня была проблема с вайлдкартами когда уровней становилось больше. Вроде dev.admin.example.com. вайлдкарт для example.com уже не катит. Это так, навскидку пример.

man python3-certbot-dns-cloudflare
apt-cache search certbot | grep dns, если нет (хотя можно и домен третьего уровня отдать под это).

Использование wildcard чревато лёгким MITM для всех, кто может использовать Let's Encrypt. Вообще, мне не нравится идея как-то вытаскивать сведения наружу об инфраструктуре; на месте хакера, прознав о DNS-зоне, доступ к которой открыт из интернета для серверов LE, я бы раз в полминуты или чаще отправлял бы запрос на TXT-записи и регулярно пополнял бы список поддоменов, которые затем можно пробить на резолв. Узнать о такой зоне может быть непросто, но sublist3r может помочь.

Резюмируя: не стоит. Вместо этого предлагаю использовать сервер step-ca с поддержкой ACME. Бинарник разворачивается на внутренней инфраструктуре. Его поведение не совсем RFCшное, например, не реализован отзыв сертификата, но чем больше людей им пользуются, тем больше шансы, что его доведут до ума.

Не вижу проблему вынести одну зону наружу.
У нас сделано так есть int.firm.lan и отдельно _acme-challenge.int.firm.lan.
Снаружи видна только зона _acme-challenge.int.firm.lan.

Да, вот здесь упоминается об идее сделать CNAME, которые все будут указывать на одну зону _acme-challenge, в таком случае уровень поддомена неважен. Но там же поднимается вопрос публичности логов LE, я чувствовал, что что-то забыл, ведь certbot предупреждает, что данные о доменах будут доступны публично. Ссылку пришлось поискать, здесь есть строка, куда можно вбить домен и посмотреть, что на него было выписано и залогировано.

В общем, wildcard - безопасный с т. з. логов вариант, но уже есть опасность MITM и сбора таким образом LDAP-паролей сотрудниками внутри компании.

Certbot делает запись TXT в зону, сервер LE считывает и выдает сертификат, запись TXT удаляется. Получение wildcard сертификата с использованием DNS абсолютно безопасно, если только у вас админка DNS не проходной двор.

Зависит от принятой в организации модели управления хостами. Если поддомен выделяется на разработчика - да, если на команду или систему распределения ресурсов (*.k8s.example.org) - нет. Если доступ к DNS имеют только пяток админов, которые также контролируют учётки - да, если делаем сервис для самовыписывания сертификатов разрабами - тут может быть и безопасно, и нет, смотря на какие домены разрешать.

Sign up to leave a comment.

Articles