В прошлой статье мы генерировали сертификат 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 — пароль к сертификату