Перевірка SSL-сертифіката сайту: онлайн, у браузері та через openssl
Перевірка SSL-сертифіката показує, чи довіряють браузери вашому https: чи не минув термін, чи збігається ім'я з доменом, чи повний ланцюжок і хто видав сертифікат. Найшвидше перевірити SSL онлайн — ввести домен у перевірку SSL-сертифіката: результат буде за кілька секунд. Без робочого сертифіката браузер позначає сайт небезпечним, і частина відвідувачів іде, не дочекавшись завантаження.
Як перевірити SSL-сертифікат онлайн: покроково
- Відкрийте перевірку SSL-сертифіката і введіть домен:
example.com. Можна вставити й повну адресу — інструмент сам виділить ім'я хоста. Нестандартний порт вказують через двокрапку:example.com:8443. - Інструмент підключається до сервера так само суворо, як браузер: перевіряє ланцюжок довіри та збіг імені. Якщо сувора перевірка не пройшла, він підключається вдруге без неї — щоб усе одно показати сертифікат і пояснити, що саме не так.
- Подивіться на верхній банер: скільки днів лишилося до кінця терміну. Менше 30 днів — жовте попередження; червоний банер означає, що браузери сертифікату не довіряють, а причини перелічені нижче: минув термін, сертифікат видано на інше ім'я, він самопідписаний або ланцюжок не перевіряється. Під списком показано й відповідь OpenSSL під час суворої перевірки.
- Перегляньте картки з деталями: Common Name, видавець, дати «дійсний з» і «дійсний до», тип і довжина ключа (RSA коротший за 2048 біт позначається як слабкий), алгоритм підпису та список альтернативних імен (SAN) — у ньому мають бути всі варіанти домену, зокрема з www.
- Повторіть перевірку для
www.example.comі для піддоменів: у кожного імені може бути свій сертифікат, і помилка часто сидить саме там, куди ніхто не заходив.
Чесно про обмеження: це разова перевірка одного імені. Вона не перебирає версії TLS і шифри, які приймає сервер, не шукає змішаний вміст на сторінках і не стежить за терміном сама. Версії протоколів перевіряють командою openssl з розділу нижче або сканером Shield.
Як подивитися сертифікат у браузері
- Chrome, Edge та інші браузери на Chromium: натисніть значок ліворуч від адреси, далі «Підключення захищене» → «Сертифікат дійсний». Відкриється вікно з полями «Кому видано», «Ким видано», терміном дії та вкладкою з ланцюжком.
- Firefox: замок → «Безпечне з'єднання» → «Докладніше» → «Переглянути сертифікат».
- Safari: замок в адресному рядку → «Показати сертифікат».
Браузер зручний, щоб швидко побачити термін і видавця, але не годиться як остаточна перевірка: він кешує проміжні сертифікати й може «добудувати» неповний ланцюжок, який робот чи мобільний застосунок не приймуть.
Перевірка SSL через командний рядок (openssl)
Утиліта openssl є в macOS і Linux, у Windows — наприклад, у складі Git for Windows. Базова команда підключається до сервера й друкує ланцюжок і результат перевірки:
openssl s_client -connect example.com:443 -servername example.com </dev/null
Параметр -servername передає ім'я сайту (SNI). Без нього сервер, на якому живе кілька сайтів, може віддати сертифікат іншого домену, і ви лагодитимете помилку, якої немає. У виводі шукайте рядок Verify return code: 0 (ok) — ланцюжок у порядку; 21 (unable to verify the first certificate) — зазвичай сервер не віддає проміжний сертифікат; 10 (certificate has expired) — минув термін; 18 (self-signed certificate) — самопідписаний.
Дати, власника й видавця зручно витягти одним рядком:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuer
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -ext subjectAltName
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -checkend 1209600
notBefore і notAfter — початок і кінець терміну, -ext subjectAltName виводить список імен (OpenSSL 1.1.1 і новіші), а -checkend 1209600 відповідає, чи спливе сертифікат найближчими 14 днями (1 209 600 секунд) — цей рядок зручно поставити в cron для моніторингу.
Чи приймає сервер застарілий протокол, покаже спроба підключитися лише ним: openssl s_client -connect example.com:443 -servername example.com -tls1_1 </dev/null. Якщо рукостискання пройшло — TLS 1.1 на сервері ввімкнено. Застереження: у свіжих збірках OpenSSL старі версії можуть бути заборонені на боці клієнта, і тоді помилка нічого не каже про сервер. Для TLS 1.2 і 1.3 використовуйте -tls1_2 і -tls1_3.
Що дивитися в звіті
| Параметр | Що повинно бути |
|---|---|
| Термін дії | Більше двох тижнів в запасі; безкоштовні сертифікати живуть близько трьох місяців і оновлюються автоматично |
| Ім'я в сертифікаті | Збігається з доменом, включаючи варіант з www |
| Ланцюг довіри | Повна: без проміжного сертифіката частина клієнтів видасть помилку |
| Протоколи | TLS 1.2 і 1.3; застарілі версії краще вимкнути |
| Видавець | Відомий центр сертифікації, а не самопідписаний сертифікат |
Що робити при помилках
- Закінчився термін. Оновіть сертифікат і перевірте, що автопродовження дійсно працює.
- Не збігається ім'я. Додайте потрібні домени в сертифікат або налаштуйте окремий.
- Неповний ланцюг. Догрузіть проміжний сертифікат на сервер.
- Змішане вміст. Замість посилань на картинки, стилі та скрипти з http на https, інакше браузер скаржиться навіть при валідному сертифікаті.
Помилки SSL: як виглядають і як виправити
| Помилка | Як проявляється | Що зробити |
|---|---|---|
| Минув термін | Chrome: NET::ERR_CERT_DATE_INVALID; openssl: certificate has expired | Перевипустіть сертифікат і перевірте автопродовження. Частий випадок: новий файл уже на диску, але вебсервер не перезавантажили, і він віддає старий. |
| Ім'я не збігається | NET::ERR_CERT_COMMON_NAME_INVALID | Випустіть сертифікат з усіма потрібними іменами в SAN — наприклад, example.com і www.example.com. Wildcard *.example.com покриває один рівень піддоменів, але не сам example.com і не a.b.example.com. |
| Неповний ланцюжок | В одних браузерах відкривається, в інших — NET::ERR_CERT_AUTHORITY_INVALID; openssl: unable to verify the first certificate | Встановіть повний ланцюжок: сертифікат сайту плюс проміжні. Для Let's Encrypt у nginx вказують fullchain.pem, а не cert.pem. |
| Самопідписаний сертифікат | NET::ERR_CERT_AUTHORITY_INVALID; openssl: self-signed certificate | Замініть на сертифікат довіреного центру. Безкоштовний варіант — Let's Encrypt або сертифікат, який випускає хостинг чи CDN. |
| Лише застарілий TLS | Зазвичай ERR_SSL_VERSION_OR_CIPHER_MISMATCH | Увімкніть TLS 1.2 і 1.3, вимкніть SSL 3.0, TLS 1.0 і 1.1, оновіть вебсервер і бібліотеку OpenSSL. |
| Неправильний час | Помилка терміну в сертифіката, який насправді дійсний | Перевірте годинник на пристрої користувача або на сервері: сертифікат звіряється з поточною датою. |
Термін дії SSL-сертифікатів
Максимальний термін публічних TLS-сертифікатів задають правила CA/Browser Forum — об'єднання центрів сертифікації та розробників браузерів. Довго стеля становила 398 днів. У квітні 2025 року форум ухвалив бюлетень SC-081 про поетапне скорочення, і перший крок уже діє:
| Дата випуску сертифіката | Максимальний термін |
|---|---|
| з 15 березня 2026 року | 200 днів |
| з 15 березня 2027 року | 100 днів |
| з 15 березня 2029 року | 47 днів |
Обмеження застосовується за датою випуску: уже виданий сертифікат допрацьовує свій термін. Деталі — у бюлетені SC-081 на сайті CA/Browser Forum. Безкоштовні сертифікати Let's Encrypt і так короткі: за FAQ Let's Encrypt вони діють 90 днів (за бажанням — 6 днів), а 90-денні радять продовжувати кожні 60 днів. Висновок простий: ручне продовження раз на рік відходить у минуле, продовжувати має автомат.
Автопродовження Let's Encrypt: як переконатися, що воно працює
sudo certbot certificates
sudo certbot renew --dry-run
systemctl list-timers | grep certbot
certbot certificatesпокаже всі сертифікати на сервері й дату закінчення кожного.certbot renew --dry-runпрожене продовження на тестовому сервері Let's Encrypt, не чіпаючи бойові сертифікати. Якщо тест падає, справжнє продовження теж упаде.- Продовження запускає таймер systemd або завдання cron; якщо certbot встановлено зі snap, таймер називається
snap.certbot.renew.timer. Немає ні того, ні іншого — автопродовження немає. - Щоб вебсервер підхопив новий сертифікат, додайте перезавантаження після продовження:
--deploy-hook "systemctl reload nginx". - Типові причини збою: шлях
/.well-known/acme-challenge/закрито редиректом, паролем чи правилом файрвола; домен переїхав на інший сервер або CDN, а certbot лишився на старому.
Якщо сертифікат випускає хостинг чи CDN, продовження зазвичай на їхньому боці — але лише поки домен вказує на них. Після зміни DNS перевірте сертифікат знову.
Моніторинг сертифіката
- Сповіщення заздалегідь. Зовнішній моніторинг або скрипт з
openssl x509 -checkendу cron: нехай сигнал приходить щонайменше за два тижні до кінця терміну. - Повторна перевірка після продовження. Проженіть домен через перевірку SSL: новий термін, повний ланцюжок, усі імена в SAN.
- Журнали Certificate Transparency. Усі публічні сертифікати потрапляють у відкриті журнали; пошук за доменом (наприклад, на crt.sh) показує, які сертифікати на нього випускали, — так видно й забуті піддомени, й неочікувані випуски.
- Регулярний аудит. Shield — платна перевірка безпеки (разово з балансу або за підпискою на моніторинг); у групі «TLS і сертифікат» він дивиться термін і валідність сертифіката, застарілі TLS 1.0/1.1, редирект з HTTP на HTTPS і HSTS.
Безкоштовний чи платний сертифікат
Для пошуку різниці немає: браузер і робот перевіряють валідність, а не ціну. Безкоштовні сертифікати видаються автоматично і оновлюються самі — цього достатньо переважній більшості сайтів. Платні мають сенс там, де потрібна розширена перевірка організації, страховка або підтримка рідкісних сценаріїв. Головне — щоб автопродовження дійсно працювало: прострочений дорогий сертифікат гірший за вчасно оновлений безкоштовний.
Як це пов'язано з просуванням
Https — базова вимога: сайт без нього втрачає довіру і відвідувачів. Крім того, помилка сертифіката заважає нашим перевіркам: сторінка може виявитися недоступною для обходу. Повну картину безпеки дає Shield, а заголовки захисту розібрані в статті про заголовки безпеки.