Регулярное обновление корневых сертификатов CA, RouterOS
ilium007
Guest
0
27.11.2020 11:58:00
Как лучше всего обновлять корневые сертификаты CA? Я запускаю скрипт ниже каждые 7 дней, но хочется понять, нет ли способа сначала проверить, действительно ли их нужно обновлять, прежде чем скачивать, удалять и заменять сертификаты каждую неделю. И ещё — может ли регулярный еженедельный запуск этого скрипта повредить flash-память (или какую там память внутри)?
Я считаю, что Mikrotik должен включать rootCA в свои прошивки так же, как это делают другие производители дистрибутивов и оборудования, ведь они реально являются частью уровня ОС, и пользователям не стоит самой устанавливать их для базовой работы. Установка своих собственных CA должна быть ограничена определёнными случаями, когда у вас своя инфраструктура, например, своя PKI.
rextended
Guest
0
13.06.2024 21:09:00
Мой предыдущий пример идеально подходит, чтобы не отказываться от проверки сертификата, даже с первого раза. Переделал, смотрите следующие посты…
majestic
Guest
0
13.06.2024 11:10:00
Это идеально, спасибо, что предоставили.
rextended
Guest
0
13.06.2024 15:48:00
Впервые не используйте «check-certificate=yes», потому что сертификат ещё не установлен. В первый раз нужно делать это вручную без «check-certificate=yes»… также не работает: /certificate remove [ find where authority expired ]; потому что ни один сертификат не является «authority» (authority — это сама машина, которая генерирует сертификаты), поэтому правильно так: /certificate remove [find where name~“certs.pem*” expired=yes]. Ещё это не работает на v6: /tool fetch url= — потому что отсутствует имя файла. (В версии v7.15.1 работает). И только /generated перенаправляет на /generated/, а v6 не поддерживает HTTP редиректы. В v6 должно быть так: /tool fetch url= .
Итого, правильный скрипт, который работает и на v6, и на v7, такой: EDIT: удалено, смотрите пост #16
majestic
Guest
0
13.06.2024 18:29:00
Вот изменения, которые я внес, потому что заметил, что скрипт всегда падает при первом запуске. Этот код основан на оригинальной версии, опубликованной @ilium007, поэтому я сделал следующие правки, чтобы он работал надёжнее.
:do { :while ($retryCount < $maxRetries && !$success) do={ :do { /tool fetch url=https://mkcert.org/generate/ check-certificate=yes dst-path=cacert.pem; /certificate remove [ find where authority expired ]; /certificate import file-name=cacert.pem passphrase=""; /file remove cacert.pem; :log info ("Обновлён список доверенных сертификатов"); :set $success true; } on-error={ :set $retryCount ($retryCount + 1); :log error ("Не удалось обновить список доверенных сертификатов. Попытка: $retryCount"); :delay 5s; # Задержка перед новой попыткой }; } :if (!$success) do={ /tool e-mail send to="noc@example.io" subject="RouterOS Certificate Update Failed" body="Не удалось обновить список доверенных сертификатов после $maxRetries попыток."; :log error ("Не удалось обновить список доверенных сертификатов после $maxRetries попыток"); } } on-error={ :log error ("Неожиданная ошибка в скрипте обновления"); }; }
Как уже говорил, при первом запуске скрипт падает, как и отметил @rextended, потому что сертификаты удаляются. Поэтому здесь небольшой цикл, который пытается выполнить обновление снова, пока не получится, максимум $maxRetries раз. Если и после этого неудача, приходит письмо.
Обновление Только что сделал те изменения, которые ты заметил, спасибо, честно говоря, не обратил внимания.
:do { :while ($retryCount < $maxRetries && !$success) do={ :do { /tool fetch url=https://mkcert.org/generate/all/except/nothing check-certificate=yes dst-path=cacert.pem; :delay 15s; # Ждём 15 секунд для скачивания /certificate remove [find where name~"cacert.pem*" expired=yes]; /certificate import file-name=cacert.pem passphrase=""; /file remove cacert.pem; :log info ("Обновлён список доверенных сертификатов"); :set $success true; } on-error={ :set $retryCount ($retryCount + 1); :log error ("Не удалось обновить список доверенных сертификатов. Попытка: $retryCount"); :delay 5s; # Задержка перед новой попыткой }; } :if (!$success) do={ /tool e-mail send to="noc@example.io" subject="RouterOS Certificate Update Failed" body="Не удалось обновить список доверенных сертификатов после $maxRetries попыток."; :log error ("Не удалось обновить список доверенных сертификатов после $maxRetries попыток"); } } on-error={ :log error ("Неожиданная ошибка в скрипте обновления"); }; }
rextended
Guest
0
13.06.2024 19:37:00
Все равно будет постоянно сбоить, пока не убрать check-certificate=yes ИЛИ пока вручную не добавить сертификаты (хотя бы сертификат для mkcert.org) впервые…
majestic
Guest
0
13.06.2024 19:38:00
Это ожидаемо, но я попробую добавить проверочный код, чтобы это можно было обойти с первого раза.
rextended
Guest
0
13.06.2024 19:58:00
Не волнуйся, всё просто…
/file print file=mkcert.txt :delay 1s set mkcert.txt content="-----BEGIN CERTIFICATE-----\r\nMIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\r\nTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\r\ncmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\r\nWhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\r\nZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\r\nMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\r\nh77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\r\n0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\r\nA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\r\nT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\r\nB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\r\nB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\r\nKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\r\nOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\r\njh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\r\nqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\r\nrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\r\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\r\nhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\r\nubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\r\n3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\r\nNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\r\nORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\r\nTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\r\njNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\r\noyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\r\n4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\r\nmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\r\nemyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\r\n-----END CERTIFICATE-----" :delay 1s /certificate import file-name=mkcert.txt passphrase="" name=imported-ca-cert_mkcert :delay 1s /file remove [find where name=mkcerts.txt] :do { /tool fetch url=https://mkcert.org/generate/all/except/nothing check-certificate=yes dst-path=mkcerts.pem :delay 1s remove [find where name~"imported-ca-cert*" and expired=yes] :delay 1s import file-name=mkcerts.pem passphrase="" name=imported-ca-cert :delay 1s /file remove [find where name=mkcerts.pem] :log info "Trust Store: Certificates update from mkcert.org succeeded" } on-error={ :log error "Trust Store: Не удалось обновить сертификаты с mkcert.org" }
Этот способ работает до понедельника, 4 июня 2035 года, 11:04:38 GMT. После этой даты встроенный сертификат (на новой машине) нужно будет обновить...
Также можно сохранить результат в файл через “:execute file=result.txt” и отправить файл result.txt по электронной почте.
Кстати, с помощью скриптов можно делать отчёты в журнал или на почту о том, какие и сколько сертификатов удалено (если такие есть), и какие и сколько добавлено (если тоже есть).
EDIT: добавлена обратная совместимость на случай неожиданного нового поведения.
majestic
Guest
0
13.06.2024 20:34:00
Просто сначала установи параметр check-certificate=no, а когда сертификаты уже будут получены, переключи обратно на yes. Я пытался добавить логику для этого, но из-за постоянных ошибок при первом импорте скрипт всё равно ломается. Поэтому гораздо проще сначала сделать с no, а потом переключиться на yes, или просто использовать no постоянно (хотя так не рекомендуется).
patrikg
Guest
0
13.06.2024 21:04:00
Говоря о проблеме с сертификатами. Mikrotik даже не обновил их на демонстрационных роутерах. Истёк срок 23 мая 2024 года в 07:41:48… Истёк срок 18 июня 2024 года в 08:37:45… Написал Нормису, но ничего не изменилось.