Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Автоматическое обновление сертификата Let's Encrypt

    Автоматическое обновление сертификата Let's Encrypt

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Автоматическое обновление сертификата Let's Encrypt, RouterOS
     
    own3r1138
    Guest
    #1
    0
    15.09.2022 09:00:00
    Привет! Известна ли какая-то причина, почему мой сертификат не обновляется автоматически? WWW включён, и правило фаервола, как мне кажется, настроено правильно.
     
     
     
    pincio
    Guest
    #2
    0
    01.12.2022 14:15:00
    Если вам будет полезно, я написал скрипт для автоматического продления, вы можете найти его по ссылке https://github.com/pincioc/LetsEncrypt_OSScript. Буду очень благодарен за оценки и комментарии. Мауро
     
     
     
    securenss
    Guest
    #3
    0
    08.11.2022 09:32:00
    спасибо, «rextended», очень понятный скрипт. Я протестировал этот скрипт и добавил функцию SSTP. У меня всё отлично работает. log info "Script - Certificate renewal start"

    :local commName "ваше доменное имя (Common Name)"
    :local dnsName "ваше доменное имя (Domain Name)"

    /ip service
    set www disabled=no

    /ip firewall filter
    enable [find where comment="IP Services HTTP"]

    /certificate
    remove [find where common-name=$commName]
    enable-ssl-certificate dns=$dnsName

    # лучше сюда вставить цикл, который будет проверять, когда сертификат готов, или таймаут через x секунд
    :delay 30s

    /certificate
    :local certName [get [find where common-name=$commName] name]

    :log info "Script - Certificate renewal | обновление сертификата UM"
    /user-manager
    set certificate=$certName
    :log info "Script - Certificate renewal | обновление сертификата UM выполнено!"

    :log info "Script - Certificate renewal | обновление сертификата WIFI EAP"
    /interface wireless security-profiles
    set [find where name="EAP"] tls-certificate=$certName
    :log info "Script - Certificate renewal | обновление сертификата WIFI EAP выполнено!"

    :log info "Script - Certificate renewal | обновление сертификата IP Services"
    /ip service
    set www-ssl certificate=$certName
    :log info "Script - Certificate renewal | обновление сертификата IP Services выполнено!"

    :log info "Script - Certificate renewal | обновление сертификата SSTP Server"
    /interface sstp-server server
    set certificate=$certName
    :log info "Script - Certificate renewal | обновление сертификата SSTP Server выполнено!"

    /ip service
    set www disabled=yes

    /ip firewall filter
    disable [find where comment="IP Services HTTP"]

    :log info "Script - Certificate renewal end"
     
     
     
    ivanforreg2015
    Guest
    #4
    0
    14.04.2023 09:20:00
    Добрый день, Mauro! Помоги, пожалуйста. Я запускаю твой скрипт: https://github.com/pincioc/LetsEncrypt_OSScript/issues/new  
    Строка кода:  
    if ( [/certificate enable-ssl-certificate dns-name=$dnsName] = 0 ) do={ ... } else={ :log info "[Letsencrypt_OSScript] - Nothing to do!" }
    Всегда возвращает ненулевой результат. Каждый раз, когда я запускаю скрипт, получаю в логе сообщение «[Letsencrypt_OSScript] - Nothing to do!», хотя сертификат всё равно обновляется! Я не могу найти документацию о том, какой тип данных должна возвращать команда [/certificate enable-ssl-certificate dns-name=$dnsName]. Пожалуйста, поделись информацией о возвращаемом типе данных для функции [/certificate enable-ssl-certificate dns-name=$dnsName]. Большое спасибо!
     
     
     
    rextended
    Guest
    #5
    0
    14.04.2023 15:09:00
    Скрипт полный ошибок. Вместо этого почитайте руководства и посмотрите видео. https://help.mikrotik.com/docs/display/ROS/Certificates#Certificates-Let’sEncryptcertificates
     
     
     
    ivanforreg2015
    Guest
    #6
    0
    20.04.2023 10:00:00
    Добрый день. Строка кода: if ( [/certificate enable-ssl-certificate dns-name=$dnsName] = 0 ) do={ ... } else={ :log info "[Letsencrypt_OSScript] - Nothing to do!" } всегда возвращает ненулевое значение. Я переписал эту часть скрипта. Возможно, кому-то будет полезно. #script name
    :local scrname "scr-LetsEncrypt-vpn-sampledomain"

    :local Daysbefore 30  
    :local dnsName "vpn.sampledomain.com"

    #cert name  
    :local certName "crt-vpn-le"

    :local array [ :toarray "" ]
    :local newvalue ""

    :if ( ([/certificate/print count-only where common-name =$dnsName] = 0 ) || ( ([/certificate/print count-only where common-name=$dnsName] > 0) && ([/certificate/get value-name=days-valid [find common-name=$dnsName]] < $Daysbefore) ) ) do={

    :log info "$scrname - Пытаюсь открыть порт в файрволе и включить сервис"  
    /ip firewall/filter/add chain=input dst-port=80 protocol=tcp action=accept place-before=0 comment=$scrname  
    /ip service enable [find port=80]

    :log info "$scrname - Запускаю процесс обновления сертификата"  
    :set $newvalue [/certificate enable-ssl-certificate dns-name=$dnsName as-value]
    :log info "$scrname - Останавливаю процесс обновления сертификата"  
    :delay 20000ms  
    :log info "$scrname - Сообщение об обновлении сертификата: $[:tostr $newvalue]"

    :if ([:typeof [:find [:tostr $newvalue] "[error]"]]="nil") do={
    :log info "$scrname - Сертификат обновлён - Закрываю двери"

    #Опциональный код. Можно удалить. НАЧАЛО  
    #Здесь я переименовываю полученный сертификат, так как у меня используется двойной WAN и два разных сертификата для ipsec RoadWarriors.

    :set $newvalue [/certificate/get value-name=name [find name~$certName]]
    /certificate remove [find name~$certName]
    :log info "$scrname - Сертификат $newvalue удалён"

    :local dttm [:tostr [/system clock get date]]
    :set newvalue ( $newvalue . [:pick $dttm 0 3] . [:pick $dttm 4 6] . [:pick $dttm 7 11] . "-")
    :set $dttm [:tostr [/system clock get time]]
    :set newvalue ( $newvalue . [:pick $dttm 0 2] . [:pick $dttm 3 5] . [:pick $dttm 6 8])
    :set newvalue ( $certName . "-" . $newvalue )

    /certificate set name=$newvalue [find name~"letsencrypt-autogen"]
    :log info "$scrname - Сертификат переименован в $newvalue"

    #####  
    :set newvalue [/certificate get [/certificate find where common-name=$dnsName] name ]
    :set $array ( $array, $newvalue );  
    # :put [:tostr $array]

    #R3 - это LetsEncrypt R3 для моих RoadWarriors  
    :set $newvalue [/certificate get [/certificate find where common-name="R3"] name ]
    # :put $newvalue  
    :set $array ( $array, $newvalue );  
    # :put [:tostr $array]
    /ip/ipsec/identity set [/ip/ipsec/identity find where comment="RoadWarriors"] certificate=$array
    :log info "$scrname - array: $[:tostr $array]"
    #####

    #Опциональный код. Можно удалить. КОНЕЦ

    } else={  
    :log error "$scrname - Не удалось сгенерировать сертификат - Закрываю двери"  
    }

    :log info "$scrname - Удаляю кастомное правило файрвола и отключаю сервисы"  
    /ip firewall/filter/remove [find comment=$scrname]
    /ip service disable [find port=80]

    } else={  
    :log info "$scrname - Действовать не нужно!"  
    }
     
     
     
    rextended
    Guest
    #7
    0
    20.04.2023 11:26:00
    Извините, но там ВСЁ ЕЩЁ полно ошибок…
     
     
     
    ivanforreg2015
    Guest
    #8
    0
    21.04.2023 12:17:00
    Добрый день! Я не программист. Этот скрипт у меня работает на CCR2004 с ROS 7.8. Если вам не трудно, пожалуйста, укажите на ошибки. Большое спасибо!
     
     
     
    edmond25
    Guest
    #9
    0
    22.11.2023 16:14:00
    Я использовал ваш код на платформе X86. Он работает для создания сертификата, но не удаётся обновить сертификат, даже если до его истечения осталось меньше 30 дней. Я нашёл, что в коде есть такой фрагмент:  
    if ( ([/certificate/print count-only where common-name =$dnsName] = 0 ) || ( ([/certificate/print count-only where common-name=$dnsName] > 0) && ([/certificate/get value-name=days-valid [find common-name=$dnsName]] < $Daysbefore) ) ) do={
    возможно, он неправильный. Я проверил, что именно “[/certificate/get value-name=days-valid [find common-name=$dnsName]” является корнем проблемы. Он не может получить значение days-valid. Поэтому скрипт никогда не заходит в процесс обновления.

    Я переписал это в следующую версию:  
    if ( ([/certificate/print count-only where common-name =$dnsName] = 0 ) || ( ([/certificate/print count-only where common-name=$dnsName] > 0) && ([/certificate get [find common-name=$dnsName] days-valid] < $Daysbefore) ) ) do={

    Теперь он корректно считывает days-valid, что подтверждаю выводом в лог:  
    log info [/certificate get [find common-name=$dnsName] days-valid]

    Пожалуйста, сообщите, если я что-то неправильно понял.
     
     
     
    itallko2010
    Guest
    #10
    0
    02.08.2024 14:31:00
    Использование значения days-valid здесь не подходит, это статичное значение — оно показывает срок действия сертификата, а не количество дней до его истечения. Вот мой скрипт для обновления по сроку действия, запускается ежедневно: если значение DAYS в окружении больше, чем “Expires After” сертификата, сертификат будет обновлён. ######## СКРИПТ АВТОМАТИЧЕСКОГО ОБНОВЛЕНИЯ LETSENCRYPT от L Hajek 08/2024 ###########

    ##############################################
    ######## ОБЪЯСНЕНИЕ ПЕРЕМЕННЫХ ОКРУЖЕНИЯ ########
    #
    # DAYS — количество дней до обновления перед истечением сертификата
    # MAILTO — адрес электронной почты для уведомлений о статусе обновления
    # ERRSUBJECT — тема письма при ошибке обновления
    # OKSUBJECT — тема письма при успешном обновлении
    # DNSNAME — DNS-имена сертификата
    # COMMONNAME — общее имя сертификата
    # NEWVALUE — имя сертификата в RouterOS (необходимо для поиска сертификата!)
    # LOGNAME — префикс для логов
    # SVCALLOW — с каких адресов разрешён доступ к WWW сервису
    #
    # Для успешного обновления должен быть открыт порт 80 из любой точки интернета
    # (например, у меня есть правило по имени LETSENCRYPT для временного доступа
    # в процессе обновления. Также я использую ограниченный сервис www,
    # который временно открывается отовсюду на время работы скрипта обновления)
    ##############################################

    ### ПЕРЕМЕННЫЕ
    :local days 20d;
    :local mailto "example@domain.com";
    :local errsubject "LE Certificate Renewall FAILED";
    :local oksubject "LE Certificate Renewall SUCCESS";
    :local dnsName "router.domain.com,host.domain.com,host2.domain2.com";
    :local commonName "router.domain.com";
    :local newvalue "letsencrypt-cert";
    :local logname "LETSENCRYPT";
    :local svcallow "10.0.0.0/8,127.0.0.1";

    ### ПРОВЕРКА
    /certificate
    :foreach item in=[find where common-name=rtr.lha-net.cz] do={
       :if (([get $item expires-after] < $days) and ![get $item expired]) do={
    :log info "$logname - Открываю порты в файрволе"
    /ip firewall/filter/enable [find comment=LETSENCRYPT]
    /ip service/set www address=""
    :delay 5s
    :log info "$logname - Запускаю обновление сертификата"
    :set $newvalue [/certificate enable-ssl-certificate dns-name=$dnsName as-value]
    :delay 60s
    :log info "$logname - Завершаю процесс обновления"
    :log info "$logname - Статус обновления сертификата: $[:tostr $newvalue]"
    /ip service/set www address="$svcallow"
    /ip firewall/filter/disable [find comment=LETSENCRYPT]
    :delay 10s
    # /certificate/remove [find where name~"letsencry*"]
    /certificate/remove [find where name="$newvalue"]
    :delay 10s
    /certificate/set [find where name~"autogen*"] name=$newvalue
    :delay 10s
    /interface/sstp-server/server/set certificate=letsencrypt-cert
    /ip/hotspot/profile/set hsprof1 ssl-certificate=letsencrypt-cert
    /ip service/set api-ssl certificate=letsencrypt-cert
    /ip service/set www-ssl certificate=letsencrypt-cert

    :if ([:typeof [:find [:tostr $newvalue] "[error]"]]="nil") do={
    :log info "$logname - Обновление сертификата УСПЕШНО"
    /tool e-mail send to="$mailto" subject=([/system identity get name]. ". $oksubject. ");

    } else={
    :log error "$logname - Обновление сертификата НЕ УДАЛОСЬ"
    /tool e-mail send to="$mailto" subject=([/system identity get name]. ". $errsubject. ");
    }
    } else={
    :log info "$logname - Сертификат действителен — НИЧЕГО ДЕЛАТЬ НЕ НУЖНО"
    }
    }
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры