Let's Encrypt сертификат на MikroTik RouterOS
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 VPN | Windows-клиент проверяет валидность сертификата сервера |
| OpenVPN | Клиент верифицирует сервер по сертификату |
| IKEv2 VPN | iOS/macOS/Windows требуют доверенный сертификат для подключения |
| Hotspot HTTPS | Страница авторизации без ошибок SSL в браузере |
| API/REST | Безопасное взаимодействие с API маршрутизатора |
Как работает Let's Encrypt
Let's Encrypt — бесплатный центр сертификации (CA), использующий протокол ACME (Automatic Certificate Management Environment). Процесс получения сертификата:
- Клиент генерирует CSR (Certificate Signing Request) и отправляет запрос на сервер ACME
- Сервер ACME выдаёт challenge (задание) для подтверждения владения доменом
- Клиент выполняет challenge — размещает файл на веб-сервере (HTTP-01) или DNS-запись (DNS-01)
- Сервер ACME проверяет challenge и выписывает сертификат
- Сертификат действителен 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-клиента, но протокол достаточно прост, чтобы реализовать его через скрипт. Создадим скрипт, который выполняет следующее:
- Запрашивает challenge у Let's Encrypt
- Размещает ответ на встроенном HTTP-сервере
- Подтверждает challenge
- Загружает и импортирует сертификат
На практике полноценная реализация 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содержитtrustedexpires-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:
bashsudo apt update && sudo apt install -y certbot
Шаг 2: Получение сертификата
Для обычного сертификата (HTTP-01):
bashsudo certbot certonly --standalone -d router.example.com --email admin@example.com --agree-tos
Для wildcard-сертификата (DNS-01):
bashsudo 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.pem | cert.pem + chain.pem |
Шаг 3: Загрузка сертификата на MikroTik
Через SCP (с Linux-сервера):
bashscp /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: откройте Files → Upload и загрузите оба файла.
Шаг 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:
bashsudo 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-name | router.example.com |
key-size | 2048 или 4096 |
days-valid | 90 |
expires-after | > 0d (если истёк — нужно обновить) |
private-key | yes |
trusted | yes |
authority | no (это не 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).
Решение:
- В настройках VPN-подключения Windows используйте доменное имя, а не IP-адрес
- Убедитесь, что CN сертификата совпадает с именем сервера
- Проверьте, что промежуточные сертификаты импортированы (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) | Полная | Полезно для автоматизации через внешние скрипты |
Рекомендации по безопасности
- Ограничивайте доступ к WebFig — не выставляйте на весь интернет, используйте
address=для ограничения по IP - Отключите HTTP после настройки HTTPS — нет причин держать незащищённый доступ
- Удаляйте PEM-файлы после импорта — приватный ключ не должен лежать на файловой системе
- Мониторьте срок действия — 90 дней проходят быстро, настройте автоматическое уведомление
- Используйте отдельный порт для 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, автоматическое обновление и мониторинг срока действия.
/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