MikroTik: Сертификат Let's Encrypt

MikroTik: Сертификат Let's Encrypt

Алгоритм получения сертификата Let’s Encrypt и последующего его продления при помощи скрипта.

Получение сертификата

  • Создать правило в брандмауэре, которое будет разрешать обращение к порту 80 IP-адресов из списка acme:
1
/ip firewall filter add action=accept chain=input dst-port=80 protocol=tcp src-address-list=acme comment="[ROS] ACME"
  • Включить сервис WWW:
1
/ip service enable www
  • Добавить адрес 0.0.0.0/0 в адрес-лист acme на 2 минуты:
1
/ip firewall address-list add list=acme address=0.0.0.0/0 timeout=00:02:00 comment="[ROS] ACME running..."
  • Запустить получение сертификата для домена sub.example.com:
1
/certificate enable-ssl-certificate dns-name=sub.example.com
  • Отключить сервис WWW:
1
/ip service disable www

Скрипт

Сертификат получен, но по условиям Let’s Encrypt, его необходимо продлевать каждые 90 дней. Этим занимается специальный скрип, который будет контролировать количество дней до истечения действия сертификата и перезапускать задачу на получения нового.

Приложение

ros.acme.rsc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# LET'S ENCRYPT
# -------------------------------------------------------------------------------------------------------------------- #
# @package    RouterOS
# @author     Kai Kimera <mail@kai.kim>
# @copyright  2024 Library Online
# @license    MIT
# @version    0.1.0
# @policy     read, write, test
# @schedule:  1d 00:00:00
# @link       https://lib.onl/ru/2024/11/f892bebc-3ecd-518a-a948-27eed31649da/
# -------------------------------------------------------------------------------------------------------------------- #

:local crtApi "https://acme-v02.api.letsencrypt.org/directory"
:local crtDays 30d

# -------------------------------------------------------------------------------------------------------------------- #
# -----------------------------------------------------< SCRIPT >----------------------------------------------------- #
# -------------------------------------------------------------------------------------------------------------------- #

:local crtDomain

/certificate
:foreach i in=[find where issuer~"Let's Encrypt"] do={
  :if (([get $i expires-after] < $crtDays) || [get $i expired]) do={
    :set crtDomain [get $i common-name]
    :do { remove $i } on-error={ :log error "ACME: $crtDomain not found!" }
    :do {
      :log info "ACME: $crtDomain renewal starting..."
      /ip service enable www
      /ip firewall address-list add list=acme address=0.0.0.0/0 timeout=00:02:00 comment="[ROS] ACME running..."
      /certificate enable-ssl-certificate directory-url="$crtApi" dns-name=$crtDomain; :delay 60s
      /ip service disable www
      /ip service set api-ssl certificate=$crtDomain
      /ip service set www-ssl certificate=$crtDomain
      /interface sstp-server server set certificate=$crtDomain
      :log info "ACME: $crtDomain renewal completed!"
    } on-error={ :log error "ACME: $crtDomain renewal failed!" }
  }
}

Параметры

  • crtApi - ссылка на ACME API. Принимает следующие значения:
    • https://acme-staging-v02.api.letsencrypt.org/directory - API для тестирования заказа сертификата.
    • https://acme-v02.api.letsencrypt.org/directory - основное API для заказа сертификата.
  • crtDays - количество дней до окончания срока действия сертификата.

Установка

После настройки скрипта, его нужно добавить в репозиторий скриптов #RouterOS. Находится репозиторий в System / Scripts. При добавлении скрипта, необходимо выбрать политики read, write, test.

Планировщик

Скрипт должен переодически запускаться для проверки сертификатов. В этом поможет планировщик #RouterOS. Заходим в System / Scheduler и создаём задачу с политиками read, write, test. В поле On Event вписываем точное название скрипта, ранее добавленного в репозиторий #RouterOS.