Вирішення проблем хостингу Практика

SSL-сертифікат не працює на хостингу: як перестати бачити «Ваше з'єднання не захищене» і повернути довіру

Попередження браузера про помилку SSL з'єднання на сайті

Уявіть: ви нарешті запустили сайт, розіслали посилання клієнтам, відкрили шампанське - і раптом вам надсилають скріншот з червоним замком та написом «Ваше з'єднання не захищене». Клієнт закриває вкладку. Google знижує позиції. Конверсія падає в прірву. А ви навіть не розумієте, що пішло не так, бо у вас все відкривається нормально. Знайомо? Проблеми з SSL-сертифікатами на хостингу - це одна з тих пасток, що виглядає як дрібниця, поки не з'їдає ваші гроші та репутацію.

Давайте розберемося, чому SSL ламається, як це діагностувати самостійно і - головне - як виправити все за хвилини, а не за дні листування з підтримкою хостингу.

Чому браузер кричить на ваш сайт, хоча сертифікат встановлений

Перше, що потрібно зрозуміти: встановити SSL-сертифікат і налаштувати його правильно - це дві абсолютно різні речі. Це як купити замок на двері, але не вставити його в дверну раму. Формально замок є. Фактично двері відкриті.

Найчастіша ситуація: ви натиснули кнопку «Встановити Let's Encrypt» у cPanel або ISPmanager, побачили зелену галочку і вирішили, що справу зроблено. Але браузер каже інше. Чому?

  • Неповний ланцюжок сертифікатів (chain) - сервер віддає тільки кінцевий сертифікат без проміжних, і браузер не може побудувати довірчий шлях до кореневого центру сертифікації
  • Mixed content - сайт вантажить CSS, JS або зображення по http замість https, і браузер вважає з'єднання небезпечним
  • Невідповідність доменного імені - сертифікат випущений для example.com, але сайт відкривається через www.example.com або піддомен
  • Протермінований сертифікат - автооновлення тихо зламалося, а ви дізналися останніми
  • Конфлікт з Cloudflare або CDN - два рівні SSL накладаються один на одного і створюють цикл редиректів

Кожна з цих причин має своє рішення. І жодна з них не потребує диплома з кібербезпеки.

Програміст налаштовує https налаштування сервера для SSL сертифіката на хостингу
Програміст налаштовує https налаштування сервера для SSL сертифіката на хостингу

Діагностика за п'ять хвилин: інструменти, які знає не кожен адмін

Перш ніж щось чіпати на сервері, потрібно зрозуміти, що саме зламано. Ось мій перевірений алгоритм, який я використовую вже років сім:

  1. SSL Labs Server Test (ssllabs.com/ssltest) - вставляєте домен, чекаєте 2 хвилини, отримуєте детальний звіт. Оцінка нижче B? Є проблема. Оцінка F? У вас пожежа.
  2. Why No Padlock (whynopadlock.com) - сканує сторінку на mixed content і показує конкретні URL, що вантажаться по http. Безцінна штука.
  3. Перевірка ланцюжка сертифікатів - команда openssl s_client -connect yourdomain.com:443 -servername yourdomain.com покаже весь chain. Якщо бачите «verify error» - проміжний сертифікат не на місці.
  4. Перевірка дати - в тому ж openssl дивіться поля «Not Before» та «Not After». Прострочено? Ось і відповідь.
  5. Інспектор браузера (F12) - вкладка Security в Chrome покаже, що конкретно не так з SSL на цій сторінці. Вкладка Console - всі http-ресурси, що блокуються.

Золоте правило: ніколи не починайте «лагодити» SSL наосліп. Спочатку діагностика - потім дія. Інакше ви ризикуєте перетворити одну проблему на п'ять.

Mixed content: невидимий ворог, що ховається у ваших картинках

Ось вам реальна історія. Один мій знайомий запустив інтернет-магазин на WordPress. SSL встановлений, замочок зелений. Через тиждень дзвонить: «На сторінках товарів замочок зник, Google Search Console сипле попередженнями». Виявилося, менеджер контенту завантажував зображення через старі посилання з http. Кілька картинок - і браузер знімає статус «безпечне з'єднання» з усієї сторінки.

Mixed content - це коли ваша https-сторінка підтягує ресурси по http. Браузер сприймає це як діру в захисті. І він правий.

Як це виправити?

  • Запустіть пошук по базі даних WordPress (плагін Better Search Replace) і замініть всі http://вашдомен на https://вашдомен
  • Перевірте хардкод у темі - деякі розробники прописують URL зображень напряму в шаблонах
  • Додайте заголовок Content-Security-Policy: upgrade-insecure-requests - це змусить браузер автоматично конвертувати http-запити в https
  • Перевірте зовнішні скрипти: Google Fonts, аналітику, віджети чатів - все повинно вантажитися по https

Здається дрібницею? Але Google офіційно заявив ще у 2014 році: HTTPS - фактор ранжування. А з 2018-го Chrome маркує всі http-сайти як «не безпечні». Кілька забутих картинок можуть коштувати вам позицій у видачі.

Технологічний фон із серверною інфраструктурою для Let's Encrypt автооновлення
Технологічний фон із серверною інфраструктурою для Let's Encrypt автооновлення

Ланцюжок сертифікатів: де зазвичай ламається довіра

Це технічна тема, але я спробую пояснити її через аналогію. Уявіть, що SSL-сертифікат - це паспорт вашого сайту. Щоб паспорт визнали дійсним, потрібен підпис від органу, якому довіряє браузер. Але ваш сертифікат підписаний не напряму кореневим центром (Root CA), а проміжним (Intermediate CA). Якщо сервер не віддає цей проміжний сертифікат разом з основним - браузер не може перевірити ланцюжок і показує помилку.

«Більше 30% усіх помилок SSL-з'єднань пов'язані з неправильною конфігурацією ланцюжка сертифікатів, а не з самим сертифікатом» - дослідження Netcraft, 2023

Як виправити? Потрібно знайти правильний intermediate certificate для вашого сертифіката (зазвичай він є на сайті центру сертифікації) і додати його у файл, який ваш вебсервер використовує як ssl_certificate. В Nginx це виглядає так: ви об'єднуєте ваш сертифікат та проміжний в один файл командою cat. В Apache прописуєте директиву SSLCertificateChainFile окремо.

Якщо ви на shared-хостингу і не маєте доступу до конфігурації вебсервера - зверніться до підтримки. Але зверніться грамотно: не «у мене SSL не працює», а «сервер не віддає intermediate certificate, ось результат SSL Labs - chain incomplete». Повірте, швидкість відповіді зросте вдвічі.

Порівняння типових SSL-проблем: що ламається, де шукати, скільки часу на фікс

Проблема Симптом у браузері Де шукати причину Час на виправлення
Протермінований сертифікат ERR_CERT_DATE_INVALID cPanel / certbot / панель провайдера 5-10 хвилин
Неповний ланцюжок ERR_CERT_AUTHORITY_INVALID Конфігурація Nginx/Apache 10-20 хвилин
Mixed content Замочок зі знаком оклику або без замочка Інспектор браузера, Console 15-60 хвилин
Невідповідність домену ERR_CERT_COMMON_NAME_INVALID Налаштування сертифіката (SAN/CN) 5-15 хвилин
Цикл редиректів з CDN ERR_TOO_MANY_REDIRECTS Налаштування Cloudflare (SSL mode) 5 хвилин
Автооновлення зламалося ERR_CERT_DATE_INVALID (раптово) cron, certbot renew, логи 10-30 хвилин

Зверніть увагу: більшість проблем вирішуються за пів години або швидше. Але тільки якщо ви знаєте, куди дивитися. Без діагностики можна витратити дні.

Автооновлення Let's Encrypt: чому воно зламалося і як зробити його «вічним»

Let's Encrypt - геніальний проєкт. Безкоштовні сертифікати, автоматичне оновлення кожні 90 днів. Красота. Але ось проблема: автооновлення ламається мовчки. Ви не отримуєте жодного сповіщення, поки сертифікат не протухне і сайт не впаде.

Типові причини поломки автооновлення:

  1. Зміна DNS - ви перенесли домен на Cloudflare, і http-01 challenge перестав проходити, бо запити йдуть через проксі
  2. Зміна шляхів на сервері - оновили вебсервер, змінили DocumentRoot, і certbot більше не може покласти файл верифікації у потрібну папку
  3. Заповнений диск - банально, але часто. Certbot не може записати новий сертифікат, тихо падає в лог, який ніхто не читає
  4. Застарілий certbot - старі версії мають баги з новими версіями ACME-протоколу

Рішення? По-перше, завжди налаштовуйте моніторинг закінчення сертифіката. Безкоштовний сервіс UptimeRobot вміє перевіряти SSL і слати алерти за 14 днів до закінчення. По-друге, запустіть вручну certbot renew --dry-run після будь-яких змін на сервері. Ця команда симулює оновлення без реальних змін і покаже помилки, якщо вони є.

І третє - додайте в cron не тільки certbot renew, але й перезавантаження вебсервера після цього. Навіть якщо сертифікат оновився на диску, Nginx чи Apache продовжуватимуть використовувати старий, поки не перечитають конфігурацію.

Cloudflare + хостинг: коли два захисники б'ються між собою

Окрема історія болю - це конфлікт SSL між Cloudflare і вашим хостингом. Cloudflare пропонує три режими SSL: Off, Flexible, Full і Full (Strict). І вибір неправильного режиму - причина номер один циклічних редиректів.

Як це працює: Cloudflare стоїть між користувачем і вашим сервером. Якщо ви обрали Flexible - Cloudflare з'єднується з вашим сервером по http, навіть якщо на ньому є SSL. А ваш сервер бачить http-запит і перенаправляє на https. Cloudflare знову з'єднується по http. І так по колу. Браузер показує ERR_TOO_MANY_REDIRECTS.

Правильне рішення: завжди використовуйте режим Full (Strict), встановіть дійсний сертифікат на хостингу і забудьте про Flexible як про страшний сон. Режим Flexible створений для ситуацій, коли SSL на сервері неможливий - а це вже рідкість навіть на найдешевших хостингах.

Якщо вам ліньки возитися з Let's Encrypt на сервері - Cloudflare дає Origin Certificate, який валідний 15 років, але працює тільки через їхню мережу. Встановлюєте його на сервер, обираєте Full (Strict) - і SSL працює без жодних проблем.

SSL на хостингу - це не та річ, яку можна налаштувати один раз і забути. Сертифікати протухають, конфігурації ламаються, CDN-сервіси додають нові шари складності. Але з правильними інструментами і розумінням того, як працює ланцюжок довіри, ви перетворюєте цю задачу з нічного кошмару на рутинну п'ятихвилинну перевірку. Запитайте себе прямо зараз: коли ви востаннє перевіряли свій SSL через SSL Labs? Якщо відповідь «ніколи» або «не пам'ятаю» - відкрийте нову вкладку і зробіть це. Результат може вас здивувати.