diff --git a/blog/wildcard-ssl-cert/cloudflare-api.png b/blog/wildcard-ssl-cert/cloudflare-api.png new file mode 100644 index 0000000..3b353f8 Binary files /dev/null and b/blog/wildcard-ssl-cert/cloudflare-api.png differ diff --git a/blog/wildcard-ssl-cert/index.md b/blog/wildcard-ssl-cert/index.md new file mode 100644 index 0000000..bd51da9 --- /dev/null +++ b/blog/wildcard-ssl-cert/index.md @@ -0,0 +1,159 @@ +--- +slug: wildcard-ssl-cert +title: Auto wildcard cert service +description: Простой способ получить wildcard ssl сертификат для своего домена с использованием Cloudflare и acme.sh +image: ./wildcard-logo.png +tags: [ssl, cloudflare, cert, wildcard, linux, docker, acme] +date: 2023-09-23T10:00 +--- + +Простой способ получить wildcard SSL сертификат для своего домена с использованием Cloudflare и acme.sh + + +[![wildcard ssl cert](./wildcard-logo.png)](/blog/wildcard-ssl-cert) + + + +## Wildcard сертификат + +Нравится изучать различные OpenSource проекты, и сейчас для многих сервисов которые запускаю у себя на серверах требуются доверенные сертификаты SSL + +Имеется свой собственный домен `akmalov.com` и поддмены следующего уровня `*.akmalov.com` создавать в любом количестве и не проблема + +Раньше пробовал использовать свой центр сертификации, прописывал в доверенных, создавал сампоподисанные сертификаты (очень неудобно, слишком много ресурсов для песочницы). +Далее решил перейти на скрипты и для отдельных поддоменов заказывал сертификаты с помощью **Let's Encrypt** и когда поддоменов набралось больше десятка решил попробовать **wildcard** сертификат, который может быть применен для всех поддоменов. + +> Один сертификат для всех поддоменов + +[![wildcard](./wildcard.jpg)](./wildcard.jpg) + + +## ACME Shell script + +После того как перепробовал различные варианты получения сертификатов, для меня самым удобным показался **acme.sh** + +Ссылка на офф [Github](https://github.com/acmesh-official/acme.sh) + +- Unix shell скрипт без лишних зависимостей +- Не нужны root права +- Есть docker образ +- Поддерживает IPv6 +- Можно использовать в cron-job для автоматического обновления сертификатов +- Простые команды для управления +- Умеет по API обращаться к Cloudflare + + +## Cloudflare + +Для управлениями DNS записями домена использую Cloudflare, из за его популярности и возможности управления по API, для многих сервисов есть очень удобные интеграции. Одна из причин выбора acme.sh это как раз, то что он дружит Cloudflare. + +:::note +Если используется другой DNS провайдер, можно использовать ручной способ указанный в документации, где придется вручную создавать `TXT` записи в админке домена +::: + +Пошагово получение API токена в Cloudflare: +- Войти в свой аккаунт [Cloudflare](https://dash.cloudflare.com) +- Нажать на иконку профиля в верхней части экрана и выбрать **My Profile** в выпадающем меню. +- Далее выберите **API Tokens** на левой панели меню. +- Нажать на кнопку **Create Token** в верхней части страницы. +- Выбрать тип токена, который нужен, задать параметры и уровень доступа для токена. +- На странице созданного токена нужно скопировать **API Token** и сохранить его (отображается только при создании больше его увидеть не получится, только пересоздать) + +:::danger Осторожно +Токен нельзя светить где попало +::: + +[![Cloudflare](./cloudflare-api.png)](./cloudflare-api.png) + +## Docker acme.sh + +Как один из больших поклонников контейнеров, не фанат устанавливать что-либо на хост систему, даже если это просто копирование скриптов. +Разработчики данного сервиса такого же мнения 💕 + +Страница на Github - [**Run acme.sh in docker**](https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker) + +Официальный образ [**Dockerhub**](https://hub.docker.com/r/neilpang/acme.sh) + +Загрузить последнюю версию или tag `latest`, привык использовать конкретную версию: +```bash +docker pull neilpang/acme.sh:3.0.6 +``` + +Для удобства с переменными буду использовать `.env` файл, следующего содержания: +``` +EMAIL=artur@example.com +URL=example.com +WILDCARD_URL=*.example.com + +CF_Token=Your cloudflare API TOKEN +``` + +В начале необходимо выполнить команду регистрации ACME по **email**, которая будет использоваться для создания ключа. + +Полученный в результате файл, нужен будет для запуска следующей команды и поэтому его необходимо сохранить вне контейнера. + +Команда `-v "./acme_data":/acme.sh` позволит создать локально на хосте директорию в которую будут сохраняться полученные файлы и останутся даже когда контейнер отработает и закроется. +```bash +docker run --rm --env-file .env -v "./acme_data":/acme.sh neilpang/acme.sh:3.0.6 --register-account -m $EMAIL +``` +В логах должно быть сообщение об успешной регистрации аккаунта + +``` +> Create account key ok. +> Registered +> ACCOUNT_THUMBPRINT='ACCOUNT KEY' +``` + +Запрос **wildcard** сертификата +```bash +docker run --rm --env-file .env -v "./acme_data":/acme.sh neilpang/acme.sh:3.0.6 --issue -d $URL -d $WILDCARD_URL --dns dns_cf +``` + +Процесс занимает примерно 3-7 минут + +В логах по результатам запроса: +``` +> Multi domain='DNS:example.com,DNS:*.example.com' +> Getting domain auth token for each domain +> Getting webroot for domain='example.com' +> Getting webroot for domain='*.example.com' +> Adding record +> Added, OK +> The txt record is added: Success. +> Let's check each DNS record now. Sleep 20 seconds first. +> Checking example.com for _acme-challenge.example.com +> Domain example.com '_acme-challenge.example.com' success. +> All success, let's return +> Verifying: example.com +> Processing, The CA is processing your order, please just wait. (1/30) +> Success +> Removing DNS records. +> Removed: Success +> Downloading cert. +> Cert success. +``` + +Сертификат получен и готов для использования (срок 3 месяца), все файлы сохранены локально в директории `./acme_data` +```bash +ls -la acme_data/example.com_ecc +``` + +```output +-rw-r--r-- 1456 Sep 24 18:33 example.com.cer +-rw-r--r-- 566 Sep 24 18:33 example.com.conf +-rw-r--r-- 477 Sep 24 18:29 example.com.csr +-rw-r--r-- 202 Sep 24 18:29 example.com.csr.conf +-rw------- 227 Sep 24 18:28 example.com.key +-rw-r--r-- 2668 Sep 24 18:33 ca.cer +-rw-r--r-- 4124 Sep 24 18:33 fullchain.cer +``` + +Можно проверить полученный сертификат командой: +```bash +openssl x509 -in acme_data/example.com_ecc/example.com.cer -text -noout +``` + +или онлайн сервисом [Certificate Decoder](https://www.sslshopper.com/certificate-decoder.html) + +Дальше тоже можно автоматизировать, создав расписание на выполнение и отправку результатов куда нужно. + diff --git a/blog/wildcard-ssl-cert/wildcard-logo.png b/blog/wildcard-ssl-cert/wildcard-logo.png new file mode 100644 index 0000000..7665952 Binary files /dev/null and b/blog/wildcard-ssl-cert/wildcard-logo.png differ diff --git a/blog/wildcard-ssl-cert/wildcard-ssl.png b/blog/wildcard-ssl-cert/wildcard-ssl.png new file mode 100644 index 0000000..68540f5 Binary files /dev/null and b/blog/wildcard-ssl-cert/wildcard-ssl.png differ diff --git a/blog/wildcard-ssl-cert/wildcard.jpg b/blog/wildcard-ssl-cert/wildcard.jpg new file mode 100644 index 0000000..2ba7efa Binary files /dev/null and b/blog/wildcard-ssl-cert/wildcard.jpg differ