Ваша предыстория SSL 🕵

Чтобы оказаться в этом посте, вы, вероятно, каким-то образом связаны с организацией, которая присутствует в Интернете, будь то веб-сайт, услуга или продукт. Этот ваш объект должен быть обнаружен вашими клиентами/пользователями через всемирную паутину и в большинстве случаев напрямую через веб-браузер (это также верно для мобильных устройств ). Чтобы это произошло, вы вместе со своей командой выбрали свой путь и разработали своего рода веб-программу, цель которой — сделать мир лучше.

В какой-то момент, в зависимости от вашей роли, вы столкнулись с SSL или HTTPS, которые, как мы надеемся, люди назвали обязательными для всех веб-сайтов, независимо от цели и содержания. Они правы в том, что они сказали, и вы должны верить им.

После этого произошло то, что либо с автоматической коммерческой настройкой, либо с перекрестной продажей хостинга вы приобрели волшебный сертификат, гарантирующий безопасность, свободу от беспокойного взгляда Google и не такой стильный сейчас замок. значок в адресной строке посетителя 🔒

Что может пойти не так? 🤷‍♂️

Когда вы купили свой сертификат и процесс прошел гладко, ваш сервер получил возможность шифрования между вашим сайтом и вашими посетителями. Этот сертификат также используется для подтверждения того, что вы можете и уполномочены использовать этот стандарт безопасности.

Этот сертификат не распечатывается один раз и действует вечно. Уполномоченная организация, стоящая за этими сертификатами, установила срок действия
«2 года максимум».

Поскольку поставщики браузеров действительно заботятся о предоставлении защищенной информации в Интернете в случае, если срок действия вашего сертификата истек или возникла какая-либо «проблема», ваши веб-посетители увидят ужасный экран неисправного SSL-сертификата.

Да, именно такую ​​раскладку экрана будет подсказывать браузер вашим пользователям 🙊

В некоторых случаях им нужно будет явно заявить, что они хотят войти в это веб-пространство, а в некоторых случаях им вообще нельзя.

Во что это могло перевести?

  • Колоссальное снижение авторитета и доверия со стороны ваших пользователей 🙅‍♂️
  • Потерянный доход и лиды 💸
  • SEO штрафы 👮‍♀️

К настоящему времени вы, вероятно, уже достаточно потрясены тем, что не забыли обновить свой SSL-сертификат, а также как можно быстрее обнаруживали проблемы с ним.

Одна вещь, которую вы можете сделать сейчас, это отправить сообщение своему веб-мастеру, чтобы проверить дату истечения срока действия сертификата. Следующее, что лучше всего сделать, — это запланировать регулярную проверку того, когда необходимо обновить сертификат, а также отслеживать подобные инциденты.

А вот и веб-автоматизация 🤖

Вы решили автоматизировать этот процесс проверки сертификата. Хорошо для вас, и инструменты веб-автоматизации вас охватили. Чтобы продемонстрировать, как мы можем это сделать, мы будем использовать Puppeteer, так как у него есть утилита для предоставления такой информации из коробки, но, вероятно, подойдет любое решение с поддержкой CDP.

Если вы не знаете, с чего начать работу с Puppeteer, вы можете просмотреть Рецепт №1 и вернуться к нему.

Просматривая документацию, мы видим, что API Puppeteer напрямую предоставляет информацию о деталях безопасности конкретного сетевого ответа через интерфейс SecurityDetails.

Этот интерфейс предоставляет очень полезную информацию, например об издателе сертификата и дате окончания действия сертификата, которую мы будем использовать для демонстрации.

Приступим!

Покажи мне код 👨‍💻

После того, как вы выполнили обычную настройку Puppeteer, первое, что нужно сделать, — это включить перехват запросов для только что созданного объекта Page.

await page.setRequestInterception(true);

Благодаря этому вы теперь получили доступ к некоторым событиям страницы, которые позволят вам прослушивать цикл запроса/ответа каждого запроса на страницах, по которым вы просматриваете.

// We do not need to do anything on the Request event, just let it move forward
page.on("request", (request) => request.continue());
page.on("response", (response) => {
  // Here the magic will occur
});
await page.goto("https://www.thehomeofwebautomation.com/")

Запрос, который нам нужно обработать, в нашем случае — это первоначальный запрос типа DOC, который выполняется для получения первого HTML-контента нашей страницы. Этот запрос содержит всю информацию о сертификате, которым мы владеем.

/* Inside the response handler */
const contentType = response.headers()["content-type"]; // Get the content-type of the response
if (contentType.match("text/html")) { // Check for an HTML specific response
  /* Retrieve the security details */
  const securityDetails = response.securityDetails();
  /* Authority that issued the certificate */
  const certificateIssuer = securityDetails.issuer();
  /* SecurityDetails.validTo() returns a Unix Timestamp so we need to convert it */
  const validToDate = new Date(securityDetails.validTo() * 1000);
  /* ... */
}

Запустите этот код и запишите некоторые вещи в консоль, чтобы заполнить данные, которые вы можете получить! В следующей части мы постараемся уведомить ответственных лиц о приближающейся дате истечения срока действия сертификата, чтобы они могли принять соответствующие меры.

/* Continue inside the conditional */
const diffInDays = computeDateDiffInDays(new Date(), validToDate); // Calculate the difference in days
if(diffInDays < 90){ // If the expiry is in less than 90 days
  notify(diffInDays, certificateIssuer); // Send a notification
}
/* The notify function can be something like */
function notify(daysRemaining, message, whoToContact = "some channel or some email address"){
  // sendSlackNotification(...) https://blog.nodeswat.com/simple-node-js-and-slack-webhook-integration-d87c95aa9600
  // sendMailToServiceManagement(...) https://blog.mailtrap.io/sending-emails-with-nodemailer/
} 

На этом мы почти закончили!

Что я бы посоветовал вам сделать, так это запланировать это как задание, которое будет запускаться каждый день, и оставить его работающим для одного или для всех доменов, которыми вы владеете и о которых заботитесь.

Некоторые дополнительные проверки

👉 Более одного текстового/html ответа

Во многих сценариях существует более одного запроса, который отвечает HTML-содержимым (соответствует условному типу содержимого), но для наших нужд первого будет достаточно. Что вы можете сделать, так это ввести простой логический флаг.

/* Higher scope from the response handler */
let initialHtmlFound = false;
/* Inside the response handler */
if (contentType.match("text/html") && !initialHtmlFound) {
  // ...
  initialHtmlFound = true;
}

👉 Перенаправления

Вероятно, нет веб-инженера, которого бы не укусили редиректы. Здесь вы можете проверить статус ответа и перейти к следующему.

if (contentType.match("text/html") && !initialHtmlFound) {
 /* You should also check for possible redirects using response.status() >= 300 && response.status() < 400 */
}

👉 Различные виды ошибок SSL

Существуют различные виды ошибок SSL, которые могут возникать, и они выдают ошибку прямо на этапе навигации. Чтобы быть в безопасности, вы также можете позаботиться о них.

// Add this simple check for the rest of the certificate error cases
await page.goto("https://expired.badssl.com/").catch(err => {
  if(err.message.match("net::ERR_CERT_")){
    notify(0, "Now we need to worry")
  }
  // Do whatever you want here
});

👉 SecurityDetails null

Последний особый случай, который я хотел бы здесь упомянуть, — это вероятность того, что SecurityDetails имеет значение null. Когда это происходит? Чаще всего, когда мы перехватываем ответ, у которого нет никаких деталей безопасности для раскрытия. Это может произойти, если вы решите перейти на страницу, на которой вообще нет SSL-сертификата, например. http://example.com

Теперь вы действительно готовы!

Дополнительное примечание 🖋

Если по какой-то причине вы в какой-то момент потеряли сюжет и шарлатан убедил вас, что вам не нужен SSL-сертификат для вашего такого особенного случая, пожалуйста, сообщите следующее. что вы делаете сегодня, пойдет к любому поставщику (Let's Encrypt бесплатен) и просто настроит эту чертову штуку. Если вы нам здесь не верите, я оставлю экспертам говорить, а г-н Трой Хант — реальная сделка.

Закрытие

Спасибо за чтение этого рецепта, и я надеюсь, что вы узнали одну или две полезные вещи для ваших усилий по веб-автоматизации. Оставайтесь в безопасности в Интернете и не позволяйте своим пользователям снова видеть один из этих неловких экранов.

Перекрестная публикация из раздела Главная страница веб-автоматизации

Изображение пользователя Danny Meneses на Pexels