В канун Нового года прошлого года мне позвонили от моего клиента. Они сказали, что их веб -сайт был заражен вирусом, и никто не может получить к нему доступ.
Теперь мой клиент запускает магазин соков и понятия не имел о том, как веб -сайт технически работает, поэтому я отбросил проблему «вируса», но он сказал, что сайт не может быть доступен Итак, я запустил Firefox в свой телефон и увидел Ваше соединение не безопасно
страница.
С тех пор, как Let’s Encrypt вышел из бета -версии, я использовал его, чтобы преобразовать все сайты моих и моих клиентов, чтобы обеспечить соединения через HTTPS. Я установил Cron, как указано Certbot Регулярно обновлять сертификаты, но он время от времени провалился, потому что я не обновлял пакеты Python или что -то в этом роде. Let’s Encrypt достаточно любезны, чтобы отправить почту до истечения срока действия, но начальные установки были сделаны сотрудниками.
С тех пор, как это было 31 декабря, я был на вечеринке, и не было места рядом с моей машиной, с которой я мог бы выйти на сервер и убить этого зверя. У меня был сотен на моем телефоне, используя, который я попал на сервер (слава богу Я добавил свои ключи в качестве авторизованных), обновил пакеты и возобновил сертификаты.
Все это в то время как люди вокруг меня считали задом наперед с 10.
Не принять на себя обещание
Это был даже не первый раз, когда это происходило, поэтому я решил тогда и там, что я собираюсь решить эту проблему для себя. Я тщательно решил не делать это моей новогодней резолюцией В противном случае я расскажу ту же историю в следующем году.
Итак, 1 января я написал сценарий Ruby (подробнее о том, что через минуту) и продолжал улучшать его, чтобы поймать всевозможные красные флаги с помощью инсталляций HTTPS, в том числе, если сертификат отменяется, затронутым Symantec Mess , является самопоглажным или проходит в прошлом/около даты истечения срока действия, подтверждая цепочку доверия и т. Д. Сценарий в конечном итоге преобразован в красивое маленькое веб -приложение под названием Сертификаты монитора , но давайте вернемся к разговору о сценарии.
Получение сертификата
Первое, что вам нужно сделать, это закупить сертификат из домена. Удивительно, но этого было трудно достичь. Я большой поклонник Httparty
За просьбы с Руби, но, к сожалению, я не смог найти способ вернуть сертификаты.
Поэтому я пошел на один слой вниз по абстракции и использовал Net:: http
Анкет Чтобы получить сертификат, вы должны запустить
require 'net/http' require 'openssl' domain_name = "example.com" uri = URI::HTTPS.build(host: domain_name) response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) cert = response.peer_cert
Это дает вам объект сертификата в Cert
переменная. Эта переменная имеет тип Openssl:: x509:: Сертификат
Анкет Они называются X.509 сертификаты , и они являются стандартом для сертификатов открытого ключа.
Сертификаты X.509 дают нам много подробностей о сертификате, в том числе о том, кто его выпустил, когда он был выпущен, когда он истекает, как найти, если он будет отменен, и множество другой полезной информации.
Поиск дат истечения
Чтобы найти дату, когда сертификат будет недействительным, вам просто нужно позвонить cert.not_after
. Это возвращает объект времени, который говорит нам, когда срок действия сертификата истекает.
Поэтому, если вы хотите, чтобы вас уведомляли каждый день в течение 2 недель до истечения срока действия сертификата, ваш сценарий будет выглядеть —
require 'net/http' require 'openssl' domain_name = "example.com" uri = URI::HTTPS.build(host: domain_name) response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) cert = response.peer_cert two_weeks = 14 * 86400 # 14 * One Day if Time.now + two_weeks > cert.not_after # send reminders end
Напоминать о себе
Вы можете использовать много вещей, чтобы отправить эти напоминания. Теперь я внедрил SMS, электронные письма (для нескольких людей), Slack и Stride In Мое приложение Анкет
У меня есть друзья, которые используют этот скрипт, чтобы подтолкнуть уведомления о мобильных телефонах (с использованием толкателя), веб-уведомлений, обновлений геккобола, добавления в списки дел, добавление к доскам Trello и т. Д. Любая коммуникационная платформа — честная игра.
Например, если вы на Mac, есть аккуратная маленькая команда Вы можете использовать для отправки уведомления себе.
Поэтому я включу эту команду в наш сценарий, чтобы отправить нам уведомления.
require 'net/http' require 'openssl' domain_name = "example.com" uri = URI::HTTPS.build(host: domain_name) response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) cert = response.peer_cert two_weeks = 14 * 86400 # 14 * One Day if Time.now + two_weeks > cert.not_after time_remaining = (cert.not_after - Time.now) days_remaining = time_remaining / 86400 `osascript -e 'display notification "Certificate for #{domain_name} will expire in #{days_remaining.to_i} days. Please renew soon." with title "#{domain_name}"'` end
Я удалил Если
Условие и запустил сценарий, и выходной выход выглядит сегодня
Теперь все, что вам нужно сделать, это добавить его в свой Crontab, и это будет напоминать вам, когда ваши сертификаты приближаются к обновлению.
Вывод
Очевидно, что сценарий, который я показал вам, не является самой элегантной частью программного обеспечения, но он выполняет работу. Если вы хотите контролировать несколько доменов, просто превратите сценарий в метод и запустите метод по каждому элементу вашего массива domain_names
Анкет
Мы только что поцарапали поверхность здесь Но это надежное начало для создания вашей инфраструктуры мониторинга и дополнительных функций, чтобы убедиться, что ваш сертификат не был отозван, или если это платный сертификат, который является эмитентом.
Я добавил все это и больше в Мое приложение Чтобы помочь сохранить проблемы HTTPS.
Надеюсь, это было полезно для таких людей, как я, которые продолжают нарушать их автоматизацию Let’s Encrypt или забыть о том, что сертификат для обновления, и руководство забыли сказать вам, что они получают почту от поставщиков, чтобы выпустить новое. 😁
Для следующего поста вы хотели бы, чтобы я показал вам, как браузеры определяют, был ли сертификат, который они получают, скомпрометированы или отозваны?
Счастливого кодирования!
Оригинал: «https://dev.to/shobhitic/monitor-your-https-certificate-expiry-with-this-script-1k02»