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

Управление сертификатами на MikroTik RouterOS

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

Сертификаты X.509 — фундаментальный элемент безопасности современных сетей. На MikroTik RouterOS сертификаты используются для HTTPS-доступа к WebFig, VPN-аутентификации (IPsec IKEv2, SSTP, OpenVPN), Hotspot captive portal, API over TLS и многих других задач. Неправильное управление сертификатами приводит к предупреждениям в браузерах, сбоям VPN-подключений и уязвимостям в безопасности.

В данной статье мы подробно рассмотрим полный жизненный цикл сертификатов на MikroTik: создание собственного CA, генерацию серверных и клиентских сертификатов, импорт сторонних сертификатов (включая Let's Encrypt), экспорт, применение к сервисам и мониторинг срока действия.

Описание

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

Основные сценарии использования сертификатов:

  1. HTTPS для WebFig/API — безопасный доступ к веб-интерфейсу и REST API маршрутизатора
  2. VPN-серверы — IPsec IKEv2, SSTP, OpenVPN требуют серверный сертификат для аутентификации
  3. VPN-клиенты — клиентские сертификаты для взаимной аутентификации (mutual TLS)
  4. Hotspot — HTTPS captive portal с доверенным сертификатом
  5. User Manager — RADIUS over TLS (RadSec)
  6. MQTT — IoT-интеграция с TLS
  7. 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-пользователей — грубая ошибка:

  • Невозможно отозвать доступ одного пользователя
  • Невозможно отследить, кто подключился
  • Компрометация одного устройства = компрометация всех

Решение: создавайте индивидуальный сертификат для каждого пользователя/устройства.

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

  1. Длина ключа: CA — 4096 бит, серверные/клиентские — 2048 бит минимум
  2. Срок действия: CA — 10 лет, серверные — 1-2 года, клиентские — 1 год
  3. Хранение: приватный ключ CA не должен покидать маршрутизатор. Для критичных инфраструктур используйте offline CA
  4. Ротация: обновляйте сертификаты заблаговременно (за 30 дней до истечения)
  5. CRL: настройте отзыв для уволенных сотрудников и скомпрометированных ключей
  6. Мониторинг: автоматическая проверка срока действия с уведомлениями
  7. Бэкап: экспортируйте 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 в надёжном месте
[admin@MikroTik] >
/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!"
}
IP / Управление сертификатами на MikroTik RouterOS