Алгоритм получения сертификата 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"
|
- Добавить адрес
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
|
1
| /ip service disable www
|
Сертификат получен, но по условиям Let’s Encrypt, его необходимо продлевать каждые 90 дней. Этим занимается специальный скрип, который будет контролировать количество дней до истечения действия сертификата и перезапускать задачу на получения нового.
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.