В прошлой статье мы генерировали сертификат Let’s Encrypt скриптом на роутере Mikrotik RB4011. Наш скрипт проверял есть ли сертификат, сколько дней до окончания. И если меньше 30 дней, мы удаляли текущий сертификат и получали новый. Всё это логировали и отправляли результат в Telegram бота.
Сейчас мы таким же способом проверим срок сертификата и если он валидный, выгрузим его на устройство для использовании в TorrServer. В данном случае это спутниковый ресивер VU+ Ultimo 4K
:global botToken
:global chatID
:global dnsName "hd.zp.ua"
:global minDaysLeft 60
:global certFound false
:global expireDate ""
:global certID ""
/log info "$dnsName: ищем сертификат..."
:foreach cert in=[/certificate find where common-name=$dnsName and issuer~"Let's Encrypt"] do={
:set certFound true
:set certID $cert
:set expireDate [/certificate get $cert invalid-after]
/log info "$dnsName: сертификат найден, ID $certID, истекает $expireDate"
}
:if ($certFound) do={
:local expireTime [:totime $expireDate]
:local nowTime [:totime ([/system clock get date] . " " . [/system clock get time])]
:local deltaStr [:tostr ($expireTime - $nowTime)]
:local totalDays 0
:if ([:find $deltaStr "w"] != nil) do={
:set totalDays ($totalDays + ([:pick $deltaStr 0 [:find $deltaStr "w"]] * 7))
:set deltaStr [:pick $deltaStr ([:find $deltaStr "w"] + 1) [:len $deltaStr]]
}
:if ([:find $deltaStr "d"] != nil) do={
:set totalDays ($totalDays + [:pick $deltaStr 0 [:find $deltaStr "d"]])
}
/log info "$dnsName: осталось $totalDays дней до окончания действия сертификата"
:if ($totalDays < $minDaysLeft) do={
:local msg "$dnsName: certificate expired or close to expire \E2\9D\8C"
/tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatID&text=$msg" keep-result=no
/log warning "$dnsName: сертификат скоро истекает или истёк"
} else={
/log info "$dnsName: экспортируем сертификат в $pemPath"
/certificate export-certificate $certID export-passphrase=mypassword type=pkcs12 file-name=max-cert
:delay 2
/log info "$dnsName: сертификат успешно экспортирован срок $totalDays"
:local msg "$dnsName: certificate valid and exported $totalDays days \E2\9C\85"
/tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatID&text=$msg" keep-result=no
}
} else={
:local msg "$dnsName: certificate not found \E2\84\B9"
/tool fetch url="https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatID&text=$msg" keep-result=no
/log warning "$dnsName: сертификат не найден"
}
export-passphrase=mypassword — тут любой пароль
Дальше скрипт для устройства где установлен TorrServer
#!/bin/sh # Пути CERT_PATH="/hdd" CERT_FILE="max-cert.p12" FULL_PEM="$CERT_PATH/full.pem" KEY_FILE="$CERT_PATH/server.key" PEM_FILE="$CERT_PATH/server.pem" # Торрент-сервер TORR_SERVER="/usr/bin/TorrServer" # Скачиваем P12 if wget ftp://root:[email protected]/$CERT_FILE -O $CERT_PATH/$CERT_FILE; then telegram-send "Сертификат успешно загружен" # Извлекаем PEM openssl pkcs12 -in $CERT_PATH/$CERT_FILE -out $FULL_PEM -nodes -passin pass:mypassword # Извлекаем ключ awk 'BEGIN {p=0} /BEGIN PRIVATE KEY/ {p=1} p; /END PRIVATE KEY/ {p=0}' $FULL_PEM > $KEY_FILE # Извлекаем первый сертификат awk 'BEGIN {p=0} /BEGIN CERTIFICATE/ {p=1} p; /END CERTIFICATE/ {if (++i==1) p=0}' $FULL_PEM > $PEM_FILE # Удаляем временный файл rm -f $FULL_PEM telegram-send "Сертификат и ключ успешно извлечены. Перезапускаю TorrServer" # Завершаем предыдущий процесс TorrServer pkill -f "$TORR_SERVER" # Запуск нового экземпляра telegram-send "Запускаю TorrServer" $TORR_SERVER --httpauth --path /hdd --ssl --sslcert $PEM_FILE --sslkey $KEY_FILE --dontkill & else telegram-send "Ошибка загрузки сертификата" fi
ftp://root:[email protected] — логин и пароль к вашему роутеру Mikrotik
pass:mypassword — пароль к сертификату