Управление сертификатами на MikroTik RouterOS
Сертификаты X.509 — фундаментальный элемент безопасности современных сетей. На MikroTik RouterOS сертификаты используются для HTTPS-доступа к WebFig, VPN-аутентификации (IPsec IKEv2, SSTP, OpenVPN), Hotspot captive portal, API over TLS и многих других задач. Неправильное управление сертификатами приводит к предупреждениям в браузерах, сбоям VPN-подключений и уязвимостям в безопасности.
В данной статье мы подробно рассмотрим полный жизненный цикл сертификатов на MikroTik: создание собственного CA, генерацию серверных и клиентских сертификатов, импорт сторонних сертификатов (включая Let's Encrypt), экспорт, применение к сервисам и мониторинг срока действия.
Описание
Зачем сертификаты на MikroTik
Основные сценарии использования сертификатов:
- HTTPS для WebFig/API — безопасный доступ к веб-интерфейсу и REST API маршрутизатора
- VPN-серверы — IPsec IKEv2, SSTP, OpenVPN требуют серверный сертификат для аутентификации
- VPN-клиенты — клиентские сертификаты для взаимной аутентификации (mutual TLS)
- Hotspot — HTTPS captive portal с доверенным сертификатом
- User Manager — RADIUS over TLS (RadSec)
- MQTT — IoT-интеграция с TLS
- Fetch — верификация удалённых серверов при HTTPS-запросах
Хранилище сертификатов
RouterOS хранит сертификаты в системном хранилище, доступном через /certificate. Каждый сертификат содержит:
- Common Name (CN) — имя субъекта (например, FQDN сервера)
- Subject Alternative Name (SAN) — дополнительные имена/IP
- Key Usage — допустимые операции (digital-signature, key-encipherment и т.д.)
- Extended Key Usage — назначение (tls-server, tls-client, ipsec-tunnel и т.д.)
- Validity — срок действия (not-before, not-after)
- Issuer — кто выдал сертификат (CA или self-signed)
- Private Key — закрытый ключ (если сертификат сгенерирован или импортирован с ключом)
Настройка
Просмотр текущих сертификатов
[admin@MikroTik] >/certificate/print detail
На свежей установке RouterOS хранилище обычно пусто.
Создание собственного CA (Certificate Authority)
Собственный CA позволяет выпускать серверные и клиентские сертификаты без обращения к внешним центрам сертификации. Это идеально для внутренней инфраструктуры (VPN, внутренние сервисы).
Шаг 1: Генерация ключевой пары и CSR для CA
[admin@MikroTik] >/certificate add name=local-ca \ common-name="MikroTik Local CA" \ country=RU \ state="Moscow" \ locality="Moscow" \ organization="MyCompany" \ unit="IT" \ key-size=4096 \ days-valid=3650 \ key-usage=crl-sign,key-cert-sign \ comment="Root CA for internal services"
Шаг 2: Подписание CA (self-signed)
[admin@MikroTik] >/certificate/sign local-ca ca-crl-host=10.0.0.1 name=local-ca
Параметр ca-crl-host указывает IP-адрес, по которому будет доступен список отозванных сертификатов (CRL). Обычно это IP самого маршрутизатора.
После подписания сертификат получит флаги KLAT (Key, Local-CA, Authority, Trusted):
[admin@MikroTik] >/certificate/print # Flags: K - PRIVATE-KEY; A - AUTHORITY; T - TRUSTED; L - CRL # NAME COMMON-NAME FINGERPRINT # 0 KLAT local-ca MikroTik Local CA abc123...
Шаг 3: Установка CA как доверенного
[admin@MikroTik] >/certificate/set local-ca trusted=yes
Создание серверного сертификата
Серверный сертификат используется для HTTPS, SSTP, OpenVPN и других серверных TLS-сервисов.
[admin@MikroTik] >/certificate add name=server-cert \ common-name="router.example.com" \ subject-alt-name=DNS:router.example.com,IP:10.0.0.1,IP:192.168.88.1 \ country=RU \ organization="MyCompany" \ key-size=2048 \ days-valid=730 \ key-usage=digital-signature,key-encipherment,tls-server \ comment="Server certificate for HTTPS and VPN"
Подписание серверного сертификата нашим CA:
[admin@MikroTik] >/certificate/sign server-cert ca=local-ca name=server-cert
Ключевые параметры:
- subject-alt-name — критически важен для современных браузеров. Chrome и Firefox игнорируют CN и проверяют только SAN. Укажите все DNS-имена и IP-адреса, через которые будет доступен сервис.
- key-usage=tls-server — указывает что сертификат предназначен для серверной аутентификации
- days-valid=730 — 2 года. Не рекомендуется более 398 дней для публичных сертификатов (ограничение CA/Browser Forum), но для внутренних можно больше.
Создание клиентского сертификата
Клиентские сертификаты используются для аутентификации VPN-клиентов (IPsec IKEv2, OpenVPN) без логина/пароля.
[admin@MikroTik] >/certificate add name=client-admin \ common-name="admin@example.com" \ country=RU \ organization="MyCompany" \ key-size=2048 \ days-valid=365 \ key-usage=digital-signature,key-encipherment,tls-client \ comment="Client cert for admin VPN" /certificate/sign client-admin ca=local-ca name=client-admin
Для каждого VPN-клиента создаётся отдельный сертификат. Это позволяет:
- Отзывать доступ конкретного пользователя без влияния на остальных
- Отслеживать подключения по имени сертификата
- Устанавливать разные сроки действия
Создание нескольких клиентских сертификатов
Для организации с несколькими сотрудниками:
[admin@MikroTik] ># Массовое создание сертификатов :foreach user in={"ivanov","petrov","sidorov"} do={ /certificate add name="client-$user" \ common-name="$user@example.com" \ key-size=2048 days-valid=365 \ key-usage=digital-signature,key-encipherment,tls-client \ comment="VPN client cert for $user" /certificate/sign "client-$user" ca=local-ca name="client-$user" }
Экспорт сертификатов
Для передачи сертификатов на клиентские устройства необходим экспорт.
Экспорт CA-сертификата (без приватного ключа):
[admin@MikroTik] >/certificate/export-certificate local-ca file-name=ca-cert type=pem
Создаст файл ca-cert.crt в хранилище маршрутизатора.
Экспорт клиентского сертификата с приватным ключом (PKCS12):
[admin@MikroTik] >/certificate/export-certificate client-admin \ file-name=client-admin \ type=pkcs12 \ export-passphrase="StrongExportPassword123"
Создаст файл client-admin.p12, содержащий сертификат, приватный ключ и цепочку CA. Файл защищён паролем.
Экспорт в PEM-формате (отдельно сертификат и ключ):
[admin@MikroTik] >/certificate/export-certificate client-admin \ file-name=client-admin \ type=pem \ export-passphrase="StrongExportPassword123"
Создаст два файла: client-admin.crt (сертификат) и client-admin.key (приватный ключ, зашифрованный паролем).
Скачивание файлов:
[admin@MikroTik] ># Просмотр экспортированных файлов /file/print where name~"client-admin"
Файлы можно скачать через WebFig (Files), FTP, SFTP или WinBox (drag & drop).
Импорт сертификатов
Импорт стороннего сертификата (например, от коммерческого CA):
[admin@MikroTik] ># Загружаем файлы на роутер (через WinBox, SFTP или fetch) # Импорт CA-цепочки /certificate/import file-name=ca-bundle.crt passphrase="" # Импорт сертификата /certificate/import file-name=server.crt passphrase="" # Импорт приватного ключа /certificate/import file-name=server.key passphrase="key-password"
Импорт PKCS12:
[admin@MikroTik] >/certificate/import file-name=certificate.p12 passphrase="p12-password"
PKCS12 импортирует сертификат, ключ и CA-цепочку одной командой.
Импорт Let's Encrypt сертификатов
Let's Encrypt предоставляет бесплатные доверенные сертификаты. RouterOS не поддерживает ACME-протокол напрямую, но можно автоматизировать процесс через скрипт.
Вариант 1: Получение через сторонний сервер с certbot:
На Linux-сервере выполните certbot, затем перенесите сертификаты на MikroTik:
[admin@MikroTik] ># Загрузка с сервера (если доступен по SFTP/HTTP) /tool/fetch url="sftp://server.local/etc/letsencrypt/live/router.example.com/fullchain.pem" \ user=admin password="password" dst-path=le-fullchain.pem mode=sftp /tool/fetch url="sftp://server.local/etc/letsencrypt/live/router.example.com/privkey.pem" \ user=admin password="password" dst-path=le-privkey.pem mode=sftp # Удаляем старый сертификат (если есть) /certificate/remove [find where common-name="router.example.com"] # Импортируем новые /certificate/import file-name=le-fullchain.pem passphrase="" /certificate/import file-name=le-privkey.pem passphrase="" # Применяем к HTTPS :local certName [/certificate/get [find where common-name="router.example.com"] name] /ip/service/set www-ssl certificate=$certName
Вариант 2: DNS-01 challenge через RouterOS-скрипт (продвинутый):
Если ваш DNS-провайдер поддерживает API (Cloudflare, Route53 и т.д.), можно автоматизировать получение Let's Encrypt сертификатов прямо с MikroTik через DNS-01 challenge. Это сложнее, но не требует дополнительного сервера.
Применение сертификатов к сервисам
HTTPS для WebFig/API:
[admin@MikroTik] >/ip/service set www-ssl certificate=server-cert disabled=no port=443 # Рекомендуется отключить HTTP (незащищённый) set www disabled=yes
SSTP VPN Server:
[admin@MikroTik] >/interface/sstp-server/server set certificate=server-cert enabled=yes
IPsec IKEv2:
[admin@MikroTik] >/ip/ipsec/profile set [ find default=yes ] hash-algorithm=sha256 enc-algorithm=aes-256 /ip/ipsec/peer add name=ikev2-peer exchange-mode=ike2 address=0.0.0.0/0 \ profile=default /ip/ipsec/identity add peer=ikev2-peer auth-method=digital-signature \ certificate=server-cert \ remote-certificate=client-admin \ match-by=certificate
OpenVPN:
[admin@MikroTik] >/interface/ovpn-server/server set certificate=server-cert enabled=yes auth=sha256 cipher=aes256-cbc
Hotspot (HTTPS Login):
[admin@MikroTik] >/ip/hotspot/profile set [find name=default] ssl-certificate=server-cert login-by=https
CRL — список отозванных сертификатов
CRL (Certificate Revocation List) позволяет отзывать скомпрометированные сертификаты без перевыпуска CA.
Отзыв сертификата:
[admin@MikroTik] ># Отзываем клиентский сертификат (например, уволенного сотрудника) /certificate/issued-revoke client-admin
Настройка CRL-сервера:
CRL доступен по адресу, указанному в ca-crl-host при подписании CA. По умолчанию RouterOS отдаёт CRL по HTTP.
[admin@MikroTik] ># Проверка CRL /certificate/crl/print
Сервисы, использующие сертификаты, будут автоматически проверять CRL при подключении клиентов.
Мониторинг срока действия
Сертификаты имеют ограниченный срок действия. Истёкший сертификат приводит к отказу сервиса. Настроим мониторинг:
[admin@MikroTik] >/system/script add name=cert-expiry-check source={ :local warnDays 30 :local botToken "YOUR_BOT_TOKEN" :local chatId "YOUR_CHAT_ID" :foreach cert in=[/certificate/find where private-key=yes] do={ :local name [/certificate/get $cert name] :local expiry [/certificate/get $cert invalid-after] :local now [/system/clock/get date] # Вычисляем оставшиеся дни :local daysLeft (($expiry - $now) / 86400) :if ($daysLeft < $warnDays && $daysLeft > 0) do={ :local msg "Certificate WARNING: '$name' expires in $daysLeft days!" :log warning $msg /tool/fetch url="https://api.telegram.org/bot$botToken/sendMessage\?chat_id=$chatId&text=$msg" \ mode=https keep-result=no } :if ($daysLeft <= 0) do={ :local msg "Certificate EXPIRED: '$name' has expired!" :log error $msg /tool/fetch url="https://api.telegram.org/bot$botToken/sendMessage\?chat_id=$chatId&text=$msg" \ mode=https keep-result=no } } } /system/scheduler add name=cert-expiry-monitor interval=1d start-time=08:00:00 \ on-event="/system/script/run cert-expiry-check" \ comment="Daily certificate expiry check"
Автоматическое обновление Let's Encrypt
Скрипт для автоматического обновления (при наличии внешнего ACME-сервера):
[admin@MikroTik] >/system/script add name=le-renew source={ :local domain "router.example.com" :local acmeServer "10.0.0.5" # Скачиваем новый сертификат /tool/fetch url="sftp://$acmeServer/certs/$domain/fullchain.pem" \ user=mikrotik password="password" dst-path=le-new-chain.pem mode=sftp /tool/fetch url="sftp://$acmeServer/certs/$domain/privkey.pem" \ user=mikrotik password="password" dst-path=le-new-key.pem mode=sftp # Удаляем старый :local oldCert [/certificate/find where common-name=$domain] :if ([:len $oldCert] > 0) do={ /certificate/remove $oldCert } # Импортируем новый /certificate/import file-name=le-new-chain.pem passphrase="" /certificate/import file-name=le-new-key.pem passphrase="" # Применяем :local newCert [/certificate/get [find where common-name=$domain] name] /ip/service/set www-ssl certificate=$newCert # Очищаем файлы /file/remove le-new-chain.pem /file/remove le-new-key.pem :log info "Let's Encrypt certificate renewed for $domain" } /system/scheduler add name=le-renew interval=60d on-event="/system/script/run le-renew" \ comment="Renew Let's Encrypt every 60 days"
Проверка
Просмотр всех сертификатов
[admin@MikroTik] >/certificate/print detail
Ключевые поля для проверки:
- private-key — yes, если приватный ключ присутствует (нужен для серверных сертификатов)
- trusted — yes, если сертификат отмечен как доверенный
- ca — yes, если это CA-сертификат
- invalid-after — дата истечения
- fingerprint — уникальный отпечаток для верификации
Проверка цепочки доверия
[admin@MikroTik] >/certificate/print where ca=yes
Убедитесь, что CA-сертификат присутствует и помечен как trusted. Без этого подписанные им сертификаты не будут считаться доверенными.
Проверка HTTPS
[admin@MikroTik] ># Проверяем что HTTPS использует правильный сертификат /ip/service/print where name=www-ssl
Из браузера откройте https://<router-ip> и проверьте сертификат (значок замка → Certificate).
Проверка TLS на VPN
[admin@MikroTik] ># Проверяем сертификат SSTP /interface/sstp-server/server/print # Проверяем сертификат OpenVPN /interface/ovpn-server/server/print # Проверяем IPsec identity /ip/ipsec/identity/print detail
Тест подключения с клиентским сертификатом
После импорта клиентского сертификата (.p12) на устройство попробуйте VPN-подключение. В логах MikroTik вы увидите:
[admin@MikroTik] >/log/print where topics~"ipsec" # или /log/print where topics~"ovpn"
Успешная аутентификация по сертификату будет отображена в логе.
Типичные ошибки
Ошибка 1: Истёкший сертификат
Самая частая проблема. Сертификат перестаёт работать в момент invalid-after, и все зависимые сервисы отказывают.
Симптомы:
- Браузер показывает
NET::ERR_CERT_DATE_INVALID - VPN-клиенты не могут подключиться
- В логах:
certificate has expired
Диагностика:
[admin@MikroTik] >/certificate/print where invalid-after<[/system/clock/get date]
Решение: перевыпустите сертификат и примените к сервисам. Настройте мониторинг (см. раздел выше).
Ошибка 2: Неправильный Key Usage
Сертификат с key-usage=tls-client не может использоваться для сервера, и наоборот.
Симптом: при установке сертификата на HTTPS/VPN-сервер — ошибка или предупреждение.
Диагностика:
[admin@MikroTik] >/certificate/print detail where name=server-cert # Проверьте поле key-usage
Решение: создайте сертификат с правильным key-usage:
- Для сервера:
key-usage=digital-signature,key-encipherment,tls-server - Для клиента:
key-usage=digital-signature,key-encipherment,tls-client - Для CA:
key-usage=crl-sign,key-cert-sign
Ошибка 3: Неполная цепочка сертификатов (Incomplete Chain)
Браузер или VPN-клиент не доверяет сертификату, хотя он выдан доверенным CA.
Причина: на MikroTik не импортирован промежуточный CA-сертификат. Клиент получает серверный сертификат, но не может проверить цепочку до корневого CA.
Диагностика:
[admin@MikroTik] ># Проверяем наличие промежуточных сертификатов /certificate/print where ca=yes
Решение: импортируйте полную цепочку (intermediate + root CA):
[admin@MikroTik] >/certificate/import file-name=intermediate-ca.crt passphrase="" /certificate/import file-name=root-ca.crt passphrase="" # Отмечаем как доверенные /certificate/set [find where common-name~"Intermediate"] trusted=yes /certificate/set [find where common-name~"Root"] trusted=yes
При экспорте PEM-файлов используйте fullchain.pem, который содержит и серверный сертификат, и промежуточные CA.
Ошибка 4: SAN не содержит IP или DNS
Современные браузеры (Chrome 58+) игнорируют поле Common Name (CN) и проверяют только Subject Alternative Name (SAN). Если SAN пуст или не содержит IP/DNS, через который вы подключаетесь, браузер покажет ошибку.
Симптом: NET::ERR_CERT_COMMON_NAME_INVALID при подключении по IP, хотя CN содержит этот IP.
Решение:
[admin@MikroTik] ># Укажите все варианты подключения в SAN /certificate add name=server-cert \ common-name="router.example.com" \ subject-alt-name=DNS:router.example.com,DNS:router.local,IP:10.0.0.1,IP:192.168.88.1 \ key-size=2048 days-valid=730 \ key-usage=digital-signature,key-encipherment,tls-server
Ошибка 5: Импортирован только сертификат без ключа
После импорта .crt файла без соответствующего .key сертификат не может использоваться для серверных сервисов.
Диагностика:
[admin@MikroTik] >/certificate/print where private-key=no
Если сертификат предназначен для сервера, но private-key=no, он бесполезен для TLS.
Решение: импортируйте приватный ключ:
[admin@MikroTik] >/certificate/import file-name=server.key passphrase="key-password"
Или используйте PKCS12, который содержит и сертификат, и ключ.
Ошибка 6: Слабый ключ
[admin@MikroTik] ># НЕБЕЗОПАСНО — RSA 1024 бит add name=weak-cert key-size=1024
RSA 1024 бит считается небезопасным с 2013 года. Минимальная рекомендуемая длина ключа — 2048 бит. Для CA рекомендуется 4096 бит.
Решение: всегда используйте key-size=2048 или выше.
Ошибка 7: Все клиенты на одном сертификате
Использование одного клиентского сертификата для всех VPN-пользователей — грубая ошибка:
- Невозможно отозвать доступ одного пользователя
- Невозможно отследить, кто подключился
- Компрометация одного устройства = компрометация всех
Решение: создавайте индивидуальный сертификат для каждого пользователя/устройства.
Рекомендации по безопасности
- Длина ключа: CA — 4096 бит, серверные/клиентские — 2048 бит минимум
- Срок действия: CA — 10 лет, серверные — 1-2 года, клиентские — 1 год
- Хранение: приватный ключ CA не должен покидать маршрутизатор. Для критичных инфраструктур используйте offline CA
- Ротация: обновляйте сертификаты заблаговременно (за 30 дней до истечения)
- CRL: настройте отзыв для уволенных сотрудников и скомпрометированных ключей
- Мониторинг: автоматическая проверка срока действия с уведомлениями
- Бэкап: экспортируйте PKCS12 с надёжным паролем и храните в безопасном месте
[admin@MikroTik] ># Полный бэкап всех сертификатов :foreach cert in=[/certificate/find where private-key=yes] do={ :local name [/certificate/get $cert name] /certificate/export-certificate $cert \ file-name="backup-$name" type=pkcs12 \ export-passphrase="BackupPassword2025!" }
Заключение
Управление сертификатами на MikroTik RouterOS — ответственная задача, требующая внимания к деталям. Ключевые моменты:
- Создавайте собственный CA для внутренней инфраструктуры
- Используйте Let's Encrypt для публичных сервисов
- Всегда указывайте SAN (subject-alt-name) для серверных сертификатов
- Контролируйте key-usage (tls-server vs tls-client)
- Мониторьте сроки действия и автоматизируйте обновление
- Используйте индивидуальные клиентские сертификаты
- Храните бэкапы PKCS12 в надёжном месте
/certificate/print detail
/certificate
add name=local-ca \
common-name="MikroTik Local CA" \
country=RU \
state="Moscow" \
locality="Moscow" \
organization="MyCompany" \
unit="IT" \
key-size=4096 \
days-valid=3650 \
key-usage=crl-sign,key-cert-sign \
comment="Root CA for internal services"
/certificate/sign local-ca ca-crl-host=10.0.0.1 name=local-ca
/certificate/print
# Flags: K - PRIVATE-KEY; A - AUTHORITY; T - TRUSTED; L - CRL
# NAME COMMON-NAME FINGERPRINT
# 0 KLAT local-ca MikroTik Local CA abc123...
/certificate/set local-ca trusted=yes
/certificate
add name=server-cert \
common-name="router.example.com" \
subject-alt-name=DNS:router.example.com,IP:10.0.0.1,IP:192.168.88.1 \
country=RU \
organization="MyCompany" \
key-size=2048 \
days-valid=730 \
key-usage=digital-signature,key-encipherment,tls-server \
comment="Server certificate for HTTPS and VPN"
/certificate/sign server-cert ca=local-ca name=server-cert
/certificate
add name=client-admin \
common-name="admin@example.com" \
country=RU \
organization="MyCompany" \
key-size=2048 \
days-valid=365 \
key-usage=digital-signature,key-encipherment,tls-client \
comment="Client cert for admin VPN"
/certificate/sign client-admin ca=local-ca name=client-admin
# Массовое создание сертификатов
:foreach user in={"ivanov","petrov","sidorov"} do={
/certificate add name="client-$user" \
common-name="$user@example.com" \
key-size=2048 days-valid=365 \
key-usage=digital-signature,key-encipherment,tls-client \
comment="VPN client cert for $user"
/certificate/sign "client-$user" ca=local-ca name="client-$user"
}
/certificate/export-certificate local-ca file-name=ca-cert type=pem
/certificate/export-certificate client-admin \
file-name=client-admin \
type=pkcs12 \
export-passphrase="StrongExportPassword123"
/certificate/export-certificate client-admin \
file-name=client-admin \
type=pem \
export-passphrase="StrongExportPassword123"
# Просмотр экспортированных файлов
/file/print where name~"client-admin"
# Загружаем файлы на роутер (через WinBox, SFTP или fetch)
# Импорт CA-цепочки
/certificate/import file-name=ca-bundle.crt passphrase=""
# Импорт сертификата
/certificate/import file-name=server.crt passphrase=""
# Импорт приватного ключа
/certificate/import file-name=server.key passphrase="key-password"
/certificate/import file-name=certificate.p12 passphrase="p12-password"
# Загрузка с сервера (если доступен по SFTP/HTTP)
/tool/fetch url="sftp://server.local/etc/letsencrypt/live/router.example.com/fullchain.pem" \
user=admin password="password" dst-path=le-fullchain.pem mode=sftp
/tool/fetch url="sftp://server.local/etc/letsencrypt/live/router.example.com/privkey.pem" \
user=admin password="password" dst-path=le-privkey.pem mode=sftp
# Удаляем старый сертификат (если есть)
/certificate/remove [find where common-name="router.example.com"]
# Импортируем новые
/certificate/import file-name=le-fullchain.pem passphrase=""
/certificate/import file-name=le-privkey.pem passphrase=""
# Применяем к HTTPS
:local certName [/certificate/get [find where common-name="router.example.com"] name]
/ip/service/set www-ssl certificate=$certName
/ip/service
set www-ssl certificate=server-cert disabled=no port=443
# Рекомендуется отключить HTTP (незащищённый)
set www disabled=yes
/interface/sstp-server/server
set certificate=server-cert enabled=yes
/ip/ipsec/profile
set [ find default=yes ] hash-algorithm=sha256 enc-algorithm=aes-256
/ip/ipsec/peer
add name=ikev2-peer exchange-mode=ike2 address=0.0.0.0/0 \
profile=default
/ip/ipsec/identity
add peer=ikev2-peer auth-method=digital-signature \
certificate=server-cert \
remote-certificate=client-admin \
match-by=certificate
/interface/ovpn-server/server
set certificate=server-cert enabled=yes auth=sha256 cipher=aes256-cbc
/ip/hotspot/profile
set [find name=default] ssl-certificate=server-cert login-by=https
# Отзываем клиентский сертификат (например, уволенного сотрудника)
/certificate/issued-revoke client-admin
# Проверка CRL
/certificate/crl/print
/system/script
add name=cert-expiry-check source={
:local warnDays 30
:local botToken "YOUR_BOT_TOKEN"
:local chatId "YOUR_CHAT_ID"
:foreach cert in=[/certificate/find where private-key=yes] do={
:local name [/certificate/get $cert name]
:local expiry [/certificate/get $cert invalid-after]
:local now [/system/clock/get date]
# Вычисляем оставшиеся дни
:local daysLeft (($expiry - $now) / 86400)
:if ($daysLeft < $warnDays && $daysLeft > 0) do={
:local msg "Certificate WARNING: '$name' expires in $daysLeft days!"
:log warning $msg
/tool/fetch url="https://api.telegram.org/bot$botToken/sendMessage\?chat_id=$chatId&text=$msg" \
mode=https keep-result=no
}
:if ($daysLeft <= 0) do={
:local msg "Certificate EXPIRED: '$name' has expired!"
:log error $msg
/tool/fetch url="https://api.telegram.org/bot$botToken/sendMessage\?chat_id=$chatId&text=$msg" \
mode=https keep-result=no
}
}
}
/system/scheduler
add name=cert-expiry-monitor interval=1d start-time=08:00:00 \
on-event="/system/script/run cert-expiry-check" \
comment="Daily certificate expiry check"
/system/script
add name=le-renew source={
:local domain "router.example.com"
:local acmeServer "10.0.0.5"
# Скачиваем новый сертификат
/tool/fetch url="sftp://$acmeServer/certs/$domain/fullchain.pem" \
user=mikrotik password="password" dst-path=le-new-chain.pem mode=sftp
/tool/fetch url="sftp://$acmeServer/certs/$domain/privkey.pem" \
user=mikrotik password="password" dst-path=le-new-key.pem mode=sftp
# Удаляем старый
:local oldCert [/certificate/find where common-name=$domain]
:if ([:len $oldCert] > 0) do={
/certificate/remove $oldCert
}
# Импортируем новый
/certificate/import file-name=le-new-chain.pem passphrase=""
/certificate/import file-name=le-new-key.pem passphrase=""
# Применяем
:local newCert [/certificate/get [find where common-name=$domain] name]
/ip/service/set www-ssl certificate=$newCert
# Очищаем файлы
/file/remove le-new-chain.pem
/file/remove le-new-key.pem
:log info "Let's Encrypt certificate renewed for $domain"
}
/system/scheduler
add name=le-renew interval=60d on-event="/system/script/run le-renew" \
comment="Renew Let's Encrypt every 60 days"
/certificate/print detail
/certificate/print where ca=yes
# Проверяем что HTTPS использует правильный сертификат
/ip/service/print where name=www-ssl
# Проверяем сертификат SSTP
/interface/sstp-server/server/print
# Проверяем сертификат OpenVPN
/interface/ovpn-server/server/print
# Проверяем IPsec identity
/ip/ipsec/identity/print detail
/log/print where topics~"ipsec"
# или
/log/print where topics~"ovpn"
/certificate/print where invalid-after<[/system/clock/get date]
/certificate/print detail where name=server-cert
# Проверьте поле key-usage
# Проверяем наличие промежуточных сертификатов
/certificate/print where ca=yes
/certificate/import file-name=intermediate-ca.crt passphrase=""
/certificate/import file-name=root-ca.crt passphrase=""
# Отмечаем как доверенные
/certificate/set [find where common-name~"Intermediate"] trusted=yes
/certificate/set [find where common-name~"Root"] trusted=yes
# Укажите все варианты подключения в SAN
/certificate
add name=server-cert \
common-name="router.example.com" \
subject-alt-name=DNS:router.example.com,DNS:router.local,IP:10.0.0.1,IP:192.168.88.1 \
key-size=2048 days-valid=730 \
key-usage=digital-signature,key-encipherment,tls-server
/certificate/print where private-key=no
/certificate/import file-name=server.key passphrase="key-password"
# НЕБЕЗОПАСНО — RSA 1024 бит
add name=weak-cert key-size=1024
# Полный бэкап всех сертификатов
:foreach cert in=[/certificate/find where private-key=yes] do={
:local name [/certificate/get $cert name]
/certificate/export-certificate $cert \
file-name="backup-$name" type=pkcs12 \
export-passphrase="BackupPassword2025!"
}