letsencrypt переход и получение wildcard

Я давно ждал вайлдкард сертификаты. И вот дождался. Вообще, всё невероятно просто,
но я наступил на такое количество граблей, что рекомендую прочесть.
Я хочу рассказать, как перейти со старого letsencrypt (в1 эндпойнт) на новый,
но если у вас нет ещё letsencrypt сертификатов, то вам ещё проще.

Этот раздел не читать :)

Tl;Dr; срузу к манула вниз статьи

История, предысловаие, и бла бла

В далёком прошлом, весь мир использовал домены, и чтобы иметь зелёный замочек в
браузере, владельцы сайтов должны были отнести кучу бумажек, флешек, файлов и
конечно же денег старому толстому дяде (камода, и многие другие компашки, типа
яблок, яндекс и т.д.). Сейчас же есть бесплатный способ получить доверие
клиентов
, но это я конечно преукрасил, думаю, 90% людей не поймут, когда будут
платить за товар картой на сайте, где нет https, и где-то 2% будут как я -
больше не будут пользоваться сервисом, даже если нет альтернатив, про остальных
не ручаюсь, но уверен, что они были бы рады чтобы их пароль (который они могут
использовать на нескольких сайтах) не передавался в открытом виде.

Этот раздел тоже не по делу, но важен для всех людей :|

В современном мире не все понимают значимость защищённого соединения :(
Также не все знают, что такое свобода слова, авторское право, и как много информации
о каждом из нас есть в сети. Дело не в том, чтобы просто повысить доверие клиентов
интернет магазина, и не в том, чтобы какой-то бложек имел зелёный значок, дело
в том, что каждый сайт должен использовать хотя бы такой не хитрый механизм как
https (tls, ssl …) для того, чтобы защитить права и свободы сознательных
и не очень людей.
Я застал времена, когда популярная социальная сеть (вк) не имела надёжного
соединения… После, они позволили пользоваться обоими подключениям: защищённым
и нет. Сейчас же, любой веб мастер / сис админ / просто пользователь может и
должен смотреть на сертификат.
Каждый кто связан с IT сферой, будь ты дизайнером, верстальщиком, менеджером или
тем более продукт оунер должен требовать SSL сертификат. И вот когда вам скажут

Сертификат много стоит. Нужно заморочится, чтобы его купить. А его ещё и
поддерживать надо! Давай без него.

Это бесплатно!

Я жлоб, и не заплатил бы 60 баксов за сертификат к блогу.
Пусть хотя бы этот пост прочитают. Здесь дана пошаговая инструкция как сделать
защищённым сайт
. Сейчас это стало невероятно просто. Сейчас есть такое
разнообразие инструментов, о котором мы и мечтать то не могли. Обслуживать эти сертификаты
вообще не надо! Есть готовые скрипты, они всё сделают, о них позже.
Кстати, не забудьте пожертвовать бравым ребяткам из letsencrypt за их огромную
работу, за их неоценимый вклад в защиту частной жизни всех нас, даже сейчас, когда
вы читаете этот пост, вы пользуетесь их серверами и трудом, на моём блоге он
подключен с самых давних времён.

Ремарка о типах сертификатов.

Если вы простой сайт, не банк, не платёжный шлюз, не огромная компания с большим
количеством бек офисов, и вас нет желания подтвердить средствами криптографии
подлинность сайта и его принадлежность к торговой марке, или же вы не
собираетесь продавать воздух - перепродавать сертификаты (что я считаю подло!)
не думайте что вам выбирать - выберете wildcard letsencrypt
Раньше ходили слухи, о том, что это сомнительный провайдер сертификатов, что его
не будут поддерживать серьёзные клиенты (машины с проприетарным ПО), и прочими баснями.
Вам на 99% подойдёт letsencrypt, а ваш администратор (или вы) оценит простоту
поддержки
таких сертификатов, если использовать wildcard.

Что такое HTTPS

HTTPS - защищённый веб (еси оч. коротко). В вебе, как и у людей, всё строится на
обмане доверие. Ваш браузер (программу, которая вам даёт возможность смотреть
этот сайт и этот пост) научен доверть некоторым Верховным Авторитетам (CA), по
этому, у них есть сертификат, которым они с помощью непорочной магии математически
обоснованных алгоритмов (в их основе лежит время - время на взлом, обычно годы,
а может и миллионы лет, смотря как считать) они дают авторитет с меньшей буквы
другим, а те ещё кому-то, и так, цепочка дошла до моего блога.
SSL Сертификат - набор букав и циферок, которые очень, ну очень долго разгадать.
Каждый сертивикат должен быть подписан другим сертификатом, этакая порука.
Вот недавно кто-то подписал letsencrypt`у такой вот сертификат, который имеет вес
для всех нормальных браузеров и вебклиентов и который может поручатся за

право владения доменом

Пару слов о wildcard: что это значит?

вы когда нибудь пользовались поиском в виндовс? Ну ок, хотя бы в баше писали
rm -Rf * или ls *? Ну ладно, эту ж статью читают суровые кодеры, вы конечно-же
использовали регулярки /.*/? Так вот, везде есть спецсимвол * - это и есть
вайлдкард! всё, никаких хитрых вещей, никакой мутной воды, этот символ (астерикс
на инглише, или звёздочка на русском) означает - давай всё подряд, как и в
поиске виндовс, вписали звёздочку - нашло всё подряд.
В контексте же сертификатов он оставляет свой прежний смысл - один сертификат
на всё!
и не надо больше парится. Говоря более строго - у меня есть сайт
tomfun.co - это доменное имя, у моего домена есть поддомен, например, demo.tomfun.co
это как бы не тот же самый бложек, но тоже публичные поделки, которые мне не жалко
показать, но они относятся к моему блогу. И у меня есть ещё масса других поддоменов.
Так вот, чтобы я не парился, мне стоит сказать “дай мне сертификат на мой домен
и на всё его поддомены” = tomfun.co и *.tomfun.co.
Но когда будет написано *.tomfun.co то это значит, что вот такие домены будут
покрыты этим вайлдкардом:

  • subdomain.tomfun.co
  • demo.tomfun.co
  • my-temporary-blog.tomfun.co

А эти НЕТ:

  • subdomain2.subdomain.tomfun.co
  • my-temporary.blog.tomfun.co

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

И так, как получить сертификат

Что будем делать

Получим сертификат :)
Ну и ещё посмотрим на скрипты. Обновим старый рабочий certbot, который уже имел
сертификаты. Если вам оно не надо, просто пропустите.

Чтобы дальше пользоваться этой инструкцией у вас должно быть

  1. linux
    ну или докер в виндовсе, или маке. Но кто на сервер ставит виндовс?!
  2. docker и docker-compose
    вообще-то, можно и без него, но нужно же установить в систему certbot.
    docker-compose тоже не очень то и нужен, можно просто -v у докера использовать
    но чего мелочится, лучше потом просто запустить компоуз ап - и оно само всё зареньювит
  3. доступ к ДНС
    вам нужно будет ручками зайти в ваш хостинг, или где там у вас ДНС записи настраиваются
    это то место, где вы айпишник прописали к сайту, или почту настроили, или гугль
    верифицировал право владения доменом.
  4. ну сайтина какая-то, иначе на чём проверять?! у меня нжинкс, он в докере
    тут я не хочу останавливаться на настройке нжинкса, апача, и хаппроксей. А надо?
    Напишите в комментах.
  5. руки
    можно даже кривые, у меня же вышло! Но тогда потренируйтесь на кошках - тестовый
    сервер у них есть, там всё как взаправду, но только с этим сертификатом в люди
    не выйдешь. Я так и делал :)

Грабли

  • когда вписываем в ДНС, в моём случае (такой подход много где) нужно дать ДНС
    запись поддомену _acme-challenge к вашему домену, так вот в ДНС запись стоит вписать
    только поддомен
  • когда проверяешь применились ли ДНС записи, проверять нужно не по домену а
    по поддомену - полный путь, у меня _acme-challengetomfun.co
  • dig не захотел у меня смотреть TXT records, пока я ему явно не указал ДНС сервер
  • не забыть запустить скрипт и передать ему домены :)
    правда, надо их написать, и чтобы не парится, проще написать оба: со звездой и без
  • не забываем, что эти сертификаты нуждаются в бекапе, и сама папочка ./configs
    должна быть скрыта подальше от посторонних глаз, но веб серверу доступ нужен
  • тестовый урл очень похож на продавский, будьте внимательны. я для тестов создал
    себе другой файл, другие пути
    все скрипты разом

Инструкция

Удаление старых конфигов

Нужно, если у вас уже был certbot и вы использовали старый способ получения
сертификатов. Можно скипнуть.
Тут подробней. В папке с конфигами (внутри докера /etc/letsencrypt/ - маппится
наружу на ./configs) лежат аккаунты, это то куда вы раньше заходили. Для нового
ендпойнта (новой версии API) нужен новый аккаунт - ваш имейл и ещё чего-то. Т.е.
аккаунты можно не удалять.
Там же есть сертификаты (./configs/archive/), и вот имя может совпасть, ведь вы
получить хотите новый сертификат вместо старого, у меня так и было :(
И ренью конфиги (./configs/renewal) - их тоже нужно удалить, ведь с новой версией
они ничего не нареньювят.
И так, всё нужное забекапить - скопипастить куда-то или создать архивчик, и
поудалять старьё.

  1. бекап всего (через sudo)
    я люблю делать архивчики через полуночный командор (apt install mc).
    • sudo mc
    • заходишь внутрь папки (./configs) которую нужно бекапить
    • жмёшь F2
    • выьераешь архивировать всё через tar gz
    • даёшь имя (если не лень)
    • жмёшь энтер
  2. понять, какой домен будет основным - что будем удалять
    я использую один основной домен - мой блог, значит его и будем искать
    я удаляю через mc, но старый sudo rm -Rf ./... никто не отменял
  3. удалить сам сертификат из ./configs/archive/tomfun.co
  4. удалить сам реньювал конфиг из ./configs/renewal/tomfun.co.conf
  5. удалить от греха подальше сим линку из ./configs/live/tomfun.co

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

Сертификаты

  1. создаём компоуз файл
    docker-compose.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: '3'
    services:
    certbot:
    image: certbot/certbot:latest
    volumes:
    - ./data:/var/lib/letsencrypt
    - ./configs:/etc/letsencrypt/
    - ./logs:/var/log/letsencrypt
    - ./.well-known:/usr/share/nginx/html/.well-known
    command: renew --verbose --server https://acme-v02.api.letsencrypt.org/directory

ему нужны только configs, остальное нужно для других вещей

  1. создаём баш скриптик в файлике
    run-new.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/usr/bin/env bash
    set -e
    # Don't forget:
    # -d *.tomfun.co tomfun.co
    docker-compose run certbot \
    certonly \
    --preferred-challenges dns-01 \
    --manual \
    --cert-path /var/lib/letsencrypt/csr \
    --key-path /var/lib/letsencrypt/key \
    --webroot-path /usr/share/nginx/html \
    --verbose \
    --rsa-key-size 4096 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    $@

сохраняем, не забываем про chmod +x run-new.sh

  1. запустить получение нового сертификата укажите ваш домен вместо tomfun.co

    1
    ./run-new.sh -d *.tomfun.co -d tomfun.co

    следуем инструкциям

    • вбиваем имейл - регистрируемся, это происходит только в первый раз,
      на имейл будут приходить уведомления о истечении срока действия сертификата,
      если его вовремя не зареньювить
    • соглашаемся с пользовательским соглашением (ну и читаем его, если надо)
    • и даже можем разрешить присылать нам всякие плюшки о безопасности
    • разрешаем просмотр нашего айпи адреса
    • читаем что оно нам пишет, оно попросит нас вписать txt dns запись
    • заходим в админку наших ДНСов, у меня неймчип, у вас должно быть что-то другое
      но в итоге нам нужно вписать 3 поля к домену, на который получаем сертификат
      • тип записи: txt record
      • поддомен: _acme-challenge
      • значение - то, что написал нам certbot
      • время обновления: минимум, чтобы не ждать долго, у меня минута
    • сохраняем днс записи, проверяем
    • ждём, иногда долго, нужно, чтобы значение, которое мы вписали добавилось
    • повторяем операцию для другого значения (вбивае, ждём, жмём ентер)
    • мы получили сертификат, из-за докера происходит маппинг путей, у меня такой путь
      configs/live/tomfun.co/fullchain.pem
      в принципе, это всё, что я хотел рассказать.
  2. настраиваем свой веб сервер, перезагружаем его. гугль в помощь, nginx

  3. проверяем

как сделать ренью? - надо запустить docker-compose up --exit-code-from certbot
самый простой способ об этом забыть - засунуть в крон, чтобы он делал это каждую
неделю, или крон в дженкинсе, интервал, что-то типа H 3 * * 6

Тест режим

для тест режима просто используйте другое значение опции server:
https://acme-staging-v02.api.letsencrypt.org/directory

также я использую вообще другие папки (вместо ./configs -> ./configs_test и т.д.),
чтобы не напутать
все скрипты разом
детали, ограничения, и возможности по вайлдкардам
certbot документация
после создания сертификата, его можно расширить используя опцию expand
кстати, можно получить 100500 вайлдкардов на один сертификат: ./run-new.sh -d *.tomfun.co -d tomfun.co -d *.example.com
rate limits
open-ssl тулза и как с её помощью посмотреть сертификаты, ключи и т.п.

P.S. спасибки друзяшком за терпение и ревью