mikrotik-wiki.ru
Главная
Загрузка...

Let's Encrypt сертификат на MikroTik RouterOS

RouterOS 7.xIP12 мин330 мар. 2026 г.
TelegramVK

SSL/TLS-сертификаты на маршрутизаторе MikroTik нужны не только для защиты веб-интерфейса WebFig — они обеспечивают безопасное подключение VPN-клиентов по SSTP, OpenVPN и IKEv2, позволяют настроить Hotspot с HTTPS-авторизацией и избавляют от предупреждений браузера о недоверенном сертификате. Let's Encrypt предоставляет бесплатные сертификаты сроком на 90 дней с возможностью автоматического обновления. В этом руководстве разберём два метода получения сертификата — встроенными средствами RouterOS через ACME-скрипт и через внешний certbot на Linux, настроим HTTPS для WebFig, привяжем сертификат к VPN-сервисам и автоматизируем продление через Scheduler.

Описание

Зачем SSL-сертификат на MikroTik

По умолчанию WebFig работает по HTTP (порт 80) — весь трафик, включая логин и пароль администратора, передаётся в открытом виде. Это критическая уязвимость, особенно если управление маршрутизатором доступно извне. Кроме того, самоподписанные сертификаты вызывают предупреждения безопасности в браузерах и могут отклоняться VPN-клиентами.

Сценарии, где нужен доверенный сертификат:

СценарийПочему нужен сертификат
HTTPS WebFigЗащита логина/пароля от перехвата, отсутствие предупреждений в браузере
SSTP VPNWindows-клиент проверяет валидность сертификата сервера
OpenVPNКлиент верифицирует сервер по сертификату
IKEv2 VPNiOS/macOS/Windows требуют доверенный сертификат для подключения
Hotspot HTTPSСтраница авторизации без ошибок SSL в браузере
API/RESTБезопасное взаимодействие с API маршрутизатора

Как работает Let's Encrypt

Let's Encrypt — бесплатный центр сертификации (CA), использующий протокол ACME (Automatic Certificate Management Environment). Процесс получения сертификата:

  1. Клиент генерирует CSR (Certificate Signing Request) и отправляет запрос на сервер ACME
  2. Сервер ACME выдаёт challenge (задание) для подтверждения владения доменом
  3. Клиент выполняет challenge — размещает файл на веб-сервере (HTTP-01) или DNS-запись (DNS-01)
  4. Сервер ACME проверяет challenge и выписывает сертификат
  5. Сертификат действителен 90 дней, обновление рекомендуется каждые 60 дней

Два типа challenge:

  • HTTP-01 — Let's Encrypt обращается к http://yourdomain.com/.well-known/acme-challenge/<token>. Требует, чтобы порт 80 был доступен извне и DNS-запись A указывала на IP маршрутизатора
  • DNS-01 — клиент создаёт TXT-запись _acme-challenge.yourdomain.com. Подходит для wildcard-сертификатов и ситуаций, когда порт 80 занят

Предварительные требования

Перед началом убедитесь в следующем:

  • RouterOS версии 7.20 или выше
  • У маршрутизатора есть публичный IP-адрес (статический или динамический с DDNS)
  • Доменное имя (например, router.example.com) с A-записью, указывающей на внешний IP маршрутизатора
  • Порт 80 (TCP) доступен извне для HTTP-01 challenge (или доступ к DNS для DNS-01)
  • Корректные настройки времени (NTP-клиент должен быть настроен — сертификаты чувствительны к времени)

Проверка и настройка NTP:

[admin@MikroTik] >
/system/ntp/client/print
/system/ntp/client/set enabled=yes servers=pool.ntp.org
/system/clock/print

Настройка

Метод 1: ACME-скрипт на RouterOS (HTTP-01 challenge)

Этот метод полностью выполняется на самом маршрутизаторе без внешних серверов. Мы используем встроенные средства RouterOS — /tool/fetch для HTTP-запросов и /certificate/import для импорта сертификатов.

Шаг 1: Подготовка firewall

Убедитесь, что порт 80 доступен извне. Временно разрешим входящие подключения:

[admin@MikroTik] >
/ip/firewall/filter/add chain=input protocol=tcp dst-port=80 action=accept \
  comment="Allow HTTP for ACME challenge" place-before=0

Если на порту 80 уже работает WebFig — временно переведите его на другой порт:

[admin@MikroTik] >
/ip/service/print
/ip/service/set www port=8080

Шаг 2: Создание ACME-скрипта

RouterOS не имеет встроенного ACME-клиента, но протокол достаточно прост, чтобы реализовать его через скрипт. Создадим скрипт, который выполняет следующее:

  1. Запрашивает challenge у Let's Encrypt
  2. Размещает ответ на встроенном HTTP-сервере
  3. Подтверждает challenge
  4. Загружает и импортирует сертификат

На практике полноценная реализация ACME в скрипте RouterOS сложна. Наиболее надёжный подход — использование готового скрипта из репозитория сообщества MikroTik. Загрузим его:

[admin@MikroTik] >
/tool/fetch url="https://raw.githubusercontent.com/gitMenv/RouterOS-LE/master/letsencrypt.rsc" \
  dst-path="letsencrypt.rsc"

/import file-name=letsencrypt.rsc

После импорта будет доступна функция $letsEncrypt. Вызовем её:

routeros
$letsEncrypt domain="router.example.com" email="admin@example.com"

Скрипт автоматически:

  • Создаст приватный ключ
  • Зарегистрируется в Let's Encrypt
  • Пройдёт HTTP-01 challenge
  • Импортирует полученный сертификат в хранилище RouterOS

Шаг 3: Проверка полученного сертификата

[admin@MikroTik] >
/certificate/print detail

В списке должен появиться сертификат с именем вашего домена. Убедитесь, что:

  • status содержит trusted
  • expires-after — примерно 90 дней
  • common-name соответствует вашему домену

Шаг 4: Назначение имени сертификату для удобства

[admin@MikroTik] >
/certificate/set [find where common-name="router.example.com"] name=le-cert

Метод 2: Получение сертификата на внешнем сервере (certbot)

Этот метод надёжнее и гибче — используем полноценный ACME-клиент certbot на Linux-сервере, а затем импортируем сертификат на MikroTik. Подходит для случаев, когда:

  • Порт 80 занят другим сервисом за NAT
  • Нужен wildcard-сертификат (DNS-01 challenge)
  • Предпочитаете проверенный инструмент вместо скриптов RouterOS

Шаг 1: Установка certbot на Linux

На Ubuntu/Debian:

bash
sudo apt update && sudo apt install -y certbot

Шаг 2: Получение сертификата

Для обычного сертификата (HTTP-01):

bash
sudo certbot certonly --standalone -d router.example.com --email admin@example.com --agree-tos

Для wildcard-сертификата (DNS-01):

bash
sudo certbot certonly --manual --preferred-challenges dns \
  -d "*.example.com" -d "example.com" \
  --email admin@example.com --agree-tos

При DNS-01 challenge certbot попросит создать TXT-запись _acme-challenge.example.com — добавьте её у вашего DNS-провайдера и дождитесь распространения (обычно 1-5 минут).

Файлы сертификата будут в /etc/letsencrypt/live/router.example.com/:

ФайлСодержимое
privkey.pemПриватный ключ
cert.pemСертификат домена
chain.pemПромежуточные сертификаты CA
fullchain.pemcert.pem + chain.pem

Шаг 3: Загрузка сертификата на MikroTik

Через SCP (с Linux-сервера):

bash
scp /etc/letsencrypt/live/router.example.com/fullchain.pem admin@203.0.113.1:fullchain.pem
scp /etc/letsencrypt/live/router.example.com/privkey.pem admin@203.0.113.1:privkey.pem

Или через WebFig: откройте FilesUpload и загрузите оба файла.

Шаг 4: Импорт сертификата в RouterOS

[admin@MikroTik] >
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""

Первая команда импортирует сертификат и цепочку CA. Вторая — привязывает приватный ключ. Обратите внимание: порядок важен — сначала сертификат, потом ключ.

[admin@MikroTik] >
/certificate/print

Вы увидите сертификат (например, fullchain.pem_0) с флагами K (key) и T (trusted). Переименуем для удобства:

[admin@MikroTik] >
/certificate/set [find where common-name="router.example.com"] name=le-cert

Шаг 5: Удаление загруженных файлов

После успешного импорта удалите PEM-файлы с файловой системы маршрутизатора — хранить приватный ключ в открытом виде на диске небезопасно:

[admin@MikroTik] >
/file/remove fullchain.pem
/file/remove privkey.pem

Включение HTTPS для WebFig

Теперь привяжем сертификат к веб-интерфейсу:

[admin@MikroTik] >
/ip/service/set www-ssl certificate=le-cert disabled=no

Проверим настройки:

[admin@MikroTik] >
/ip/service/print

Убедитесь, что www-ssl активен на порту 443 и привязан к сертификату le-cert.

Рекомендуется отключить незащищённый HTTP после проверки HTTPS:

[admin@MikroTik] >
/ip/service/set www disabled=yes

Теперь WebFig доступен по адресу https://router.example.com. Браузер не должен выдавать предупреждений о безопасности.

Ограничение доступа к WebFig по IP

Для безопасности рекомендуется ограничить доступ к WebFig определёнными IP-адресами:

[admin@MikroTik] >
/ip/service/set www-ssl address=192.168.88.0/24,10.0.0.0/8

Это позволит подключаться к WebFig только из указанных подсетей.

Использование сертификата для VPN-сервисов

SSTP VPN-сервер

[admin@MikroTik] >
/interface/sstp-server/server/set enabled=yes certificate=le-cert \
  default-profile=default-encryption

SSTP-клиент Windows проверяет, что CN сертификата совпадает с именем сервера при подключении. Используйте доменное имя, а не IP-адрес.

OpenVPN-сервер

[admin@MikroTik] >
/interface/ovpn-server/server/set enabled=yes certificate=le-cert \
  cipher=aes256-gcm auth=sha256 port=1194

Клиенту потребуется файл CA-сертификата Let's Encrypt. Экспортируйте его:

[admin@MikroTik] >
/certificate/export-certificate [find where name~"ISRG\\|R3\\|R10\\|R11"] \
  file-name=le-ca type=pem

IKEv2 VPN

Для IKEv2 сертификат Let's Encrypt подходит при условии, что CN или SAN совпадает с идентификатором сервера:

[admin@MikroTik] >
/ip/ipsec/identity/set [find] auth-method=digital-signature \
  certificate=le-cert remote-certificate=none \
  generate-policy=port-strict match-by=certificate

Подробная настройка IKEv2 с сертификатами описана в отдельном руководстве.

Автоматическое обновление сертификата

Сертификаты Let's Encrypt действуют 90 дней. Настроим автоматическое обновление.

Вариант A: Обновление скриптом на RouterOS

Если сертификат получен через ACME-скрипт (Метод 1), создадим задание в Scheduler:

[admin@MikroTik] >
/system/scheduler/add name=renew-le-cert interval=60d \
  on-event="$letsEncrypt domain=\"router.example.com\" email=\"admin@example.com\"" \
  start-date=2026-01-01 start-time=03:00:00 \
  comment="Renew Let's Encrypt certificate"

Вариант B: Обновление через внешний сервер

Если используете certbot (Метод 2), настройте cron на Linux-сервере для автоматического обновления и загрузки на MikroTik:

[admin@MikroTik] >
#!/bin/bash
# /usr/local/bin/renew-mikrotik-cert.sh

DOMAIN="router.example.com"
MIKROTIK_HOST="203.0.113.1"
MIKROTIK_USER="admin"
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"

# Обновляем сертификат
certbot renew --quiet

# Загружаем на MikroTik
scp "$CERT_DIR/fullchain.pem" "$MIKROTIK_USER@$MIKROTIK_HOST:fullchain.pem"
scp "$CERT_DIR/privkey.pem" "$MIKROTIK_USER@$MIKROTIK_HOST:privkey.pem"

# Импортируем через SSH
ssh "$MIKROTIK_USER@$MIKROTIK_HOST" << 'ROSCMD'
/certificate/remove [find where name=le-cert]
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""
/certificate/set [find where common-name="router.example.com"] name=le-cert
/ip/service/set www-ssl certificate=le-cert
/file/remove fullchain.pem
/file/remove privkey.pem
ROSCMD

echo "Certificate renewed and uploaded to MikroTik"

Добавьте в crontab:

bash
sudo crontab -e
# Добавить строку:
0 3 1 */2 * /usr/local/bin/renew-mikrotik-cert.sh >> /var/log/mikrotik-cert-renew.log 2>&1

Скрипт будет выполняться 1-го числа каждого чётного месяца в 03:00.

Wildcard-сертификат через DNS challenge

Wildcard-сертификат (*.example.com) покрывает все поддомены: router.example.com, vpn.example.com, hotspot.example.com и т.д. Для его получения обязателен DNS-01 challenge.

Автоматизация DNS challenge зависит от вашего DNS-провайдера. Certbot поддерживает плагины для популярных провайдеров:

[admin@MikroTik] >
# Пример для Cloudflare
sudo apt install python3-certbot-dns-cloudflare

# Создаём файл с API-токеном
sudo mkdir -p /etc/letsencrypt
cat > /etc/cloudflare.ini << 'EOF'
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
EOF
sudo chmod 600 /etc/cloudflare.ini

# Получаем wildcard-сертификат
sudo certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /etc/cloudflare.ini \
  -d "*.example.com" -d "example.com" \
  --email admin@example.com --agree-tos

Далее импортируем на MikroTik по Методу 2 (шаги 3-5).

Проверка

Проверка сертификата в RouterOS

[admin@MikroTik] >
/certificate/print detail where name=le-cert

Обратите внимание на следующие поля:

ПолеОжидаемое значение
common-namerouter.example.com
key-size2048 или 4096
days-valid90
expires-after> 0d (если истёк — нужно обновить)
private-keyyes
trustedyes
authorityno (это не CA-сертификат)

Проверка HTTPS извне

С Linux-машины:

[admin@MikroTik] >
# Проверка подключения
curl -v https://router.example.com 2>&1 | grep -E "subject|issuer|expire"

# Детальная проверка сертификата
openssl s_client -connect router.example.com:443 -servername router.example.com < /dev/null 2>/dev/null | openssl x509 -noout -text | head -20

# Проверка цепочки сертификатов
openssl s_client -connect router.example.com:443 -servername router.example.com < /dev/null 2>&1 | grep -A2 "Certificate chain"

Проверка привязки к сервисам

[admin@MikroTik] >
# WebFig HTTPS
/ip/service/print where name=www-ssl

# SSTP
/interface/sstp-server/server/print

# OpenVPN
/interface/ovpn-server/server/print

Все сервисы должны показывать certificate=le-cert.

Проверка срока действия

Создадим скрипт мониторинга, который отправит уведомление, если до истечения сертификата осталось менее 14 дней:

[admin@MikroTik] >
/system/script/add name=check-cert-expiry source={
  :local certName "le-cert"
  :local warnDays 14
  :local cert [/certificate/get [find name=$certName]]
  :local expiresAfter ($cert->"expires-after")
  :if ($expiresAfter < ($warnDays * 24:00:00)) do={
    /log/warning ("Certificate " . $certName . " expires in " . $expiresAfter)
    # При необходимости добавьте отправку email или Telegram
  }
}

/system/scheduler/add name=check-cert interval=1d \
  on-event="/system/script/run check-cert-expiry" \
  start-time=09:00:00

Типичные ошибки

Ошибка: порт 80 занят или заблокирован

Симптомы: ACME-скрипт не может пройти HTTP-01 challenge, Let's Encrypt возвращает ошибку connection refused или timeout.

Причина: Порт 80 занят сервисом WebFig или заблокирован firewall-правилами.

Решение:

[admin@MikroTik] >
# Проверяем, что занимает порт 80
/ip/service/print where port=80

# Переводим WebFig на другой порт
/ip/service/set www port=8080

# Проверяем firewall — правило accept для порта 80 должно быть выше drop
/ip/firewall/filter/print where chain=input

# Добавляем разрешающее правило в начало цепочки
/ip/firewall/filter/add chain=input protocol=tcp dst-port=80 action=accept \
  comment="Allow ACME HTTP-01" place-before=0

После получения сертификата можно удалить правило для порта 80.

Ошибка: DNS не указывает на IP MikroTik

Симптомы: Let's Encrypt возвращает DNS problem: NXDOMAIN или No valid IP addresses found for domain.

Причина: A-запись домена не настроена или указывает на другой IP.

Решение: Проверьте DNS-записи:

[admin@MikroTik] >
# На Linux/macOS
nslookup router.example.com
dig +short router.example.com

# Сравните с внешним IP маршрутизатора
curl -s ifconfig.me

Убедитесь, что A-запись router.example.com указывает на внешний IP вашего MikroTik. При использовании динамического IP настройте DDNS:

[admin@MikroTik] >
/ip/cloud/set ddns-enabled=yes
/ip/cloud/print
# Используйте значение dns-name (xxxx.sn.mynetname.net) или настройте CNAME

Ошибка: неполная цепочка сертификатов

Симптомы: Браузер показывает ошибку ERR_CERT_AUTHORITY_INVALID, хотя сертификат валиден. OpenSSL выдаёт verify error:num=21:unable to verify the first certificate.

Причина: Импортирован только сертификат домена (cert.pem) без промежуточных CA-сертификатов.

Решение: Используйте fullchain.pem вместо cert.pem при импорте:

[admin@MikroTik] >
# Удаляем старый сертификат
/certificate/remove [find where name=le-cert]

# Импортируем полную цепочку
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""

# Проверяем — должно быть два сертификата: домен + CA
/certificate/print

В списке сертификатов должны появиться и сертификат домена, и промежуточный CA-сертификат Let's Encrypt.

Ошибка: несовпадение времени

Симптомы: Сертификат отвергается клиентом как not yet valid или expired, хотя он только что выпущен.

Причина: Часы маршрутизатора показывают неправильное время.

Решение:

[admin@MikroTik] >
# Проверяем текущее время
/system/clock/print

# Включаем NTP-клиент
/system/ntp/client/set enabled=yes servers=pool.ntp.org

# Ждём синхронизации и проверяем статус
/system/ntp/client/print

Ошибка: сертификат без приватного ключа

Симптомы: При назначении сертификата сервису — ошибка certificate has no private key.

Причина: Приватный ключ не был импортирован или импортирован до сертификата (неправильный порядок).

Решение:

[admin@MikroTik] >
# Проверяем наличие ключа
/certificate/print detail where name=le-cert
# Поле private-key должно быть yes

# Если нет — повторно импортируем в правильном порядке
/certificate/remove [find where common-name="router.example.com"]
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""

Ошибка: rate limit Let's Encrypt

Симптомы: Let's Encrypt возвращает ошибку too many certificates already issued или rate limit exceeded.

Причина: Превышен лимит — Let's Encrypt выдаёт максимум 50 сертификатов на домен в неделю.

Решение: При тестировании используйте staging-сервер Let's Encrypt, который имеет более мягкие лимиты:

[admin@MikroTik] >
# На Linux с certbot
sudo certbot certonly --standalone -d router.example.com \
  --staging --email admin@example.com --agree-tos

Staging-сертификаты не будут доверены браузерами, но позволят отладить процесс без риска блокировки.

Ошибка: SSTP-клиент отвергает сертификат

Симптомы: Windows SSTP-клиент не подключается, ошибка The certificate is not valid for the requested usage или The revocation function was unable to check revocation.

Причина: CN или SAN сертификата не совпадает с именем сервера в настройках клиента, или клиент не может проверить отзыв (OCSP/CRL).

Решение:

  1. В настройках VPN-подключения Windows используйте доменное имя, а не IP-адрес
  2. Убедитесь, что CN сертификата совпадает с именем сервера
  3. Проверьте, что промежуточные сертификаты импортированы (fullchain)
[admin@MikroTik] >
/certificate/print detail where name=le-cert
# Поле common-name должно совпадать с адресом SSTP-сервера в настройках клиента

Таблица совместимости VPN-сервисов с Let's Encrypt

СервисПоддержка LEОсобенности
WebFig HTTPSПолнаяРаботает без ограничений
SSTPПолнаяCN должен совпадать с адресом подключения
OpenVPNПолнаяКлиенту нужен CA-сертификат LE
IKEv2УсловнаяРаботает, но самоподписанный CA удобнее для контроля
Hotspot HTTPSПолнаяСертификат привязывается к профилю Hotspot
API (REST)ПолнаяПолезно для автоматизации через внешние скрипты

Рекомендации по безопасности

  1. Ограничивайте доступ к WebFig — не выставляйте на весь интернет, используйте address= для ограничения по IP
  2. Отключите HTTP после настройки HTTPS — нет причин держать незащищённый доступ
  3. Удаляйте PEM-файлы после импорта — приватный ключ не должен лежать на файловой системе
  4. Мониторьте срок действия — 90 дней проходят быстро, настройте автоматическое уведомление
  5. Используйте отдельный порт для SSH — не только HTTPS, но и SSH должен быть защищён:
[admin@MikroTik] >
/ip/service/set ssh port=2222 address=192.168.88.0/24
/ip/service/set api-ssl certificate=le-cert disabled=no
/ip/service/set api disabled=yes

Эта конфигурация обеспечивает полноценную защиту всех сервисов MikroTik с помощью бесплатного доверенного сертификата Let's Encrypt, автоматическое обновление и мониторинг срока действия.

[admin@MikroTik] >
/system/ntp/client/print
/system/ntp/client/set enabled=yes servers=pool.ntp.org
/system/clock/print
/ip/firewall/filter/add chain=input protocol=tcp dst-port=80 action=accept \
  comment="Allow HTTP for ACME challenge" place-before=0
/ip/service/print
/ip/service/set www port=8080
/tool/fetch url="https://raw.githubusercontent.com/gitMenv/RouterOS-LE/master/letsencrypt.rsc" \
  dst-path="letsencrypt.rsc"

/import file-name=letsencrypt.rsc
$letsEncrypt domain="router.example.com" email="admin@example.com"
/certificate/print detail
/certificate/set [find where common-name="router.example.com"] name=le-cert
sudo apt update && sudo apt install -y certbot
sudo certbot certonly --standalone -d router.example.com --email admin@example.com --agree-tos
sudo certbot certonly --manual --preferred-challenges dns \
  -d "*.example.com" -d "example.com" \
  --email admin@example.com --agree-tos
scp /etc/letsencrypt/live/router.example.com/fullchain.pem admin@203.0.113.1:fullchain.pem
scp /etc/letsencrypt/live/router.example.com/privkey.pem admin@203.0.113.1:privkey.pem
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""
/certificate/print
/certificate/set [find where common-name="router.example.com"] name=le-cert
/file/remove fullchain.pem
/file/remove privkey.pem
/ip/service/set www-ssl certificate=le-cert disabled=no
/ip/service/print
/ip/service/set www disabled=yes
/ip/service/set www-ssl address=192.168.88.0/24,10.0.0.0/8
/interface/sstp-server/server/set enabled=yes certificate=le-cert \
  default-profile=default-encryption
/interface/ovpn-server/server/set enabled=yes certificate=le-cert \
  cipher=aes256-gcm auth=sha256 port=1194
/certificate/export-certificate [find where name~"ISRG\\|R3\\|R10\\|R11"] \
  file-name=le-ca type=pem
/ip/ipsec/identity/set [find] auth-method=digital-signature \
  certificate=le-cert remote-certificate=none \
  generate-policy=port-strict match-by=certificate
/system/scheduler/add name=renew-le-cert interval=60d \
  on-event="$letsEncrypt domain=\"router.example.com\" email=\"admin@example.com\"" \
  start-date=2026-01-01 start-time=03:00:00 \
  comment="Renew Let's Encrypt certificate"
#!/bin/bash
# /usr/local/bin/renew-mikrotik-cert.sh

DOMAIN="router.example.com"
MIKROTIK_HOST="203.0.113.1"
MIKROTIK_USER="admin"
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"

# Обновляем сертификат
certbot renew --quiet

# Загружаем на MikroTik
scp "$CERT_DIR/fullchain.pem" "$MIKROTIK_USER@$MIKROTIK_HOST:fullchain.pem"
scp "$CERT_DIR/privkey.pem" "$MIKROTIK_USER@$MIKROTIK_HOST:privkey.pem"

# Импортируем через SSH
ssh "$MIKROTIK_USER@$MIKROTIK_HOST" << 'ROSCMD'
/certificate/remove [find where name=le-cert]
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""
/certificate/set [find where common-name="router.example.com"] name=le-cert
/ip/service/set www-ssl certificate=le-cert
/file/remove fullchain.pem
/file/remove privkey.pem
ROSCMD

echo "Certificate renewed and uploaded to MikroTik"
sudo crontab -e
# Добавить строку:
0 3 1 */2 * /usr/local/bin/renew-mikrotik-cert.sh >> /var/log/mikrotik-cert-renew.log 2>&1
# Пример для Cloudflare
sudo apt install python3-certbot-dns-cloudflare

# Создаём файл с API-токеном
sudo mkdir -p /etc/letsencrypt
cat > /etc/cloudflare.ini << 'EOF'
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
EOF
sudo chmod 600 /etc/cloudflare.ini

# Получаем wildcard-сертификат
sudo certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /etc/cloudflare.ini \
  -d "*.example.com" -d "example.com" \
  --email admin@example.com --agree-tos
/certificate/print detail where name=le-cert
# Проверка подключения
curl -v https://router.example.com 2>&1 | grep -E "subject|issuer|expire"

# Детальная проверка сертификата
openssl s_client -connect router.example.com:443 -servername router.example.com < /dev/null 2>/dev/null | openssl x509 -noout -text | head -20

# Проверка цепочки сертификатов
openssl s_client -connect router.example.com:443 -servername router.example.com < /dev/null 2>&1 | grep -A2 "Certificate chain"
# WebFig HTTPS
/ip/service/print where name=www-ssl

# SSTP
/interface/sstp-server/server/print

# OpenVPN
/interface/ovpn-server/server/print
/system/script/add name=check-cert-expiry source={
  :local certName "le-cert"
  :local warnDays 14
  :local cert [/certificate/get [find name=$certName]]
  :local expiresAfter ($cert->"expires-after")
  :if ($expiresAfter < ($warnDays * 24:00:00)) do={
    /log/warning ("Certificate " . $certName . " expires in " . $expiresAfter)
    # При необходимости добавьте отправку email или Telegram
  }
}

/system/scheduler/add name=check-cert interval=1d \
  on-event="/system/script/run check-cert-expiry" \
  start-time=09:00:00
# Проверяем, что занимает порт 80
/ip/service/print where port=80

# Переводим WebFig на другой порт
/ip/service/set www port=8080

# Проверяем firewall — правило accept для порта 80 должно быть выше drop
/ip/firewall/filter/print where chain=input

# Добавляем разрешающее правило в начало цепочки
/ip/firewall/filter/add chain=input protocol=tcp dst-port=80 action=accept \
  comment="Allow ACME HTTP-01" place-before=0
# На Linux/macOS
nslookup router.example.com
dig +short router.example.com

# Сравните с внешним IP маршрутизатора
curl -s ifconfig.me
/ip/cloud/set ddns-enabled=yes
/ip/cloud/print
# Используйте значение dns-name (xxxx.sn.mynetname.net) или настройте CNAME
# Удаляем старый сертификат
/certificate/remove [find where name=le-cert]

# Импортируем полную цепочку
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""

# Проверяем — должно быть два сертификата: домен + CA
/certificate/print
# Проверяем текущее время
/system/clock/print

# Включаем NTP-клиент
/system/ntp/client/set enabled=yes servers=pool.ntp.org

# Ждём синхронизации и проверяем статус
/system/ntp/client/print
# Проверяем наличие ключа
/certificate/print detail where name=le-cert
# Поле private-key должно быть yes

# Если нет — повторно импортируем в правильном порядке
/certificate/remove [find where common-name="router.example.com"]
/certificate/import file-name=fullchain.pem passphrase=""
/certificate/import file-name=privkey.pem passphrase=""
# На Linux с certbot
sudo certbot certonly --standalone -d router.example.com \
  --staging --email admin@example.com --agree-tos
/certificate/print detail where name=le-cert
# Поле common-name должно совпадать с адресом SSTP-сервера в настройках клиента
/ip/service/set ssh port=2222 address=192.168.88.0/24
/ip/service/set api-ssl certificate=le-cert disabled=no
/ip/service/set api disabled=yes
IP / Let's Encrypt сертификат на MikroTik RouterOS