Введение: как быстро диагностировать ошибку SSL/TLS
Ошибка SSL/TLS блокирует доступ к сайту, почте или API. Браузер показывает предупреждение, клиент не подключается, запросы падают. В большинстве случаев проблему можно решить за 10 минут, если знать причину. В этой статье разбираем типовые причины ошибок SSL/TLS и даем пошаговые инструкции для их устранения на стороне клиента и сервера.
Первичная диагностика: проверьте срок действия сертификата, цепочку доверия и соответствие имени домена. Используйте команды openssl или онлайн-инструменты. Если ошибка возникает только у одного пользователя, начните с проверки системного времени и кэша браузера. Если ошибка массовая, проблема на сервере.
Ссылки на разделы для быстрого перехода:
- Основные причины ошибок SSL/TLS
- Исправление в браузере
- Исправление на сервере
- Диагностика через командную строку
- Ошибки в почте и API
- Предотвращение ошибок
Основные причины ошибок SSL/TLS и их признаки
Ошибки SSL/TLS возникают по четырем основным причинам: истекший срок действия сертификата, недоверие к центру сертификации (CA), несоответствие имени домена, проблемы с цепочкой доверия. Каждая причина имеет характерное сообщение в браузере и метод проверки.
Истекший срок действия сертификата
Браузер показывает NET::ERR_CERT_DATE_INVALID (Chrome) или SEC_ERROR_EXPIRED_CERTIFICATE (Firefox). Причина: сертификат не продлен вовремя, автоматическое обновление не настроено или не сработало.
Проверка даты истечения:
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -datesВывод покажет notBefore и notAfter. Если текущая дата выходит за пределы, сертификат недействителен. Для быстрой проверки в браузере нажмите на значок замка и посмотрите срок действия.
Недоверие к центру сертификации (CA)
Сообщение NET::ERR_CERT_AUTHORITY_INVALID означает, что браузер не доверяет издателю сертификата. Причины: самоподписанный сертификат, корпоративный CA не добавлен в доверенные, отсутствуют промежуточные сертификаты.
Проверка цепочки доверия:
openssl s_client -connect example.com:443 -servername example.com -showcertsВ выводе должны присутствовать все сертификаты цепочки, включая корневой (если он передан). Если цепочка неполная, клиент не может проверить подпись.
Несоответствие имени домена в сертификате
Ошибка NET::ERR_CERT_COMMON_NAME_INVALID возникает, когда сертификат выпущен на другой домен или в нем отсутствует нужный SAN (Subject Alternative Name). Например, сертификат для example.com, а пользователь заходит на www.example.com.
Проверка SAN:
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -ext subjectAltNameУбедитесь, что запрошенный домен есть в списке SAN. Для поддоменов нужен wildcard-сертификат (*.example.com) или отдельный сертификат.
Проблемы с цепочкой доверия
Ошибка Unable to verify the first certificate или Certificate chain is incomplete указывает на отсутствие промежуточных сертификатов на сервере. Клиент получает только конечный сертификат и не может построить цепочку до доверенного корня.
Проверка цепочки:
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep -E "Verify return code|depth"Если Verify return code: 21 (unable to verify the first certificate), сервер не передает промежуточные сертификаты. Исправьте конфигурацию веб-сервера, объединив конечный и промежуточные сертификаты в один файл.
Пошаговое исправление ошибок SSL/TLS в браузере
Если ошибка возникает только у вас, начните с проверки клиентской стороны. Выполните шаги по порядку.
Проверка системного времени и даты
Неверное системное время приводит к ошибкам валидации срока действия сертификата. Браузер считает, что сертификат еще не действителен или уже истек.
Проверьте и исправьте время:
- Windows: Параметры > Время и язык > Дата и время. Включите автоматическую установку времени.
- Linux:
timedatectlдля проверки,sudo ntpdate pool.ntp.orgдля синхронизации. - macOS: Системные настройки > Основные > Дата и время. Включите автоматическую установку.
Очистка кэша SSL и состояния браузера
Кэшированные сертификаты могут конфликтовать с новыми. Очистите SSL state:
- Chrome: Настройки > Конфиденциальность и безопасность > Безопасность > Управление сертификатами > Очистить состояние SSL.
- Firefox: Настройки > Приватность и защита > Сертификаты > Очистить состояние SSL.
- Safari: Настройки > Конфиденциальность > Управление данными сайтов > Удалить все.
Проверка антивируса и брандмауэра
Некоторые антивирусы подменяют сертификаты для сканирования HTTPS-трафика. Это вызывает ошибки недоверия. Временно отключите проверку HTTPS в антивирусе (Avast, Kaspersky) или добавьте сайт в исключения. Если ошибка исчезла, настройте исключение постоянно.
Если после этих шагов ошибка сохраняется, проблема на сервере. Переходите к следующему разделу.
Исправление ошибок SSL/TLS на стороне сервера
Системные администраторы могут устранить причину ошибки, обновив сертификат, настроив цепочку доверия или исправив конфигурацию веб-сервера.
Обновление истекшего сертификата
Для Let's Encrypt используйте certbot:
sudo certbot renew --dry-runЕсли проверка успешна, выполните обновление без dry-run и перезагрузите веб-сервер:
sudo certbot renew
sudo systemctl reload nginxДля коммерческих сертификатов сгенерируйте новый CSR, закажите сертификат у CA, получите файлы и установите их на сервер. Пример для Nginx:
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;Для Apache:
SSLCertificateFile /etc/apache2/ssl/example.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/example.com.keyНастройка цепочки доверия (промежуточные сертификаты)
Получите промежуточные сертификаты от CA и объедините их с конечным сертификатом в один файл. Порядок: конечный сертификат, затем промежуточные, затем корневой (если требуется).
Пример для Nginx:
ssl_certificate /etc/nginx/ssl/example.com.chained.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;Для Apache используйте SSLCertificateChainFile (в новых версиях можно включить цепочку в основной файл):
SSLCertificateFile /etc/apache2/ssl/example.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/example.com.key
SSLCertificateChainFile /etc/apache2/ssl/example.com.chain.crtПосле изменения конфигурации проверьте синтаксис и перезагрузите сервер.
Исправление несоответствия имени домена
Проверьте SAN текущего сертификата. Если нужного домена нет, перевыпустите сертификат с правильными SAN. Для Let's Encrypt:
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.comАльтернатива: настройте 301 редирект с www на без www или наоборот, чтобы пользователи всегда попадали на домен, указанный в сертификате.
Настройка SSL/TLS в Nginx и Apache
Используйте современные протоколы и надежные шифры. Пример для Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;Для Apache:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder onПосле изменений проверьте конфигурацию: nginx -t или apachectl configtest.
Диагностика SSL/TLS с помощью командной строки
Команды openssl позволяют быстро проверить сертификат и выявить проблему.
Проверка срока действия и деталей сертификата
Получение информации о сертификате:
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -issuer -subject -ext subjectAltNameВывод покажет даты, издателя, тему и альтернативные имена.
Проверка цепочки доверия
Просмотр всех сертификатов, передаваемых сервером:
openssl s_client -connect example.com:443 -servername example.com -showcertsУбедитесь, что в выводе есть все промежуточные сертификаты. Проверка кода возврата:
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep "Verify return code"Код 0 (ok) означает успешную проверку.
Тестирование с помощью SSL Labs
Используйте онлайн-сервис SSL Labs для комплексного анализа конфигурации. Он выявляет проблемы с цепочкой, протоколами, шифрами и дает рекомендации.
Устранение ошибок SSL/TLS в почтовых клиентах и API-запросах
Ошибки SSL/TLS возникают не только в браузерах, но и в почтовых клиентах и при вызове API.
Настройка SSL/TLS в почтовых клиентах
Для IMAP и SMTP используйте правильные порты и типы шифрования:
- IMAP SSL/TLS: порт 993
- POP3 SSL/TLS: порт 995
- SMTP SSL/TLS: порт 465
- SMTP STARTTLS: порт 587
Если используется самоподписанный сертификат, добавьте исключение в почтовом клиенте, но убедитесь в подлинности сертификата.
Решение проблем SSL в API-запросах (curl, библиотеки)
Типичная ошибка curl: SSL certificate problem: unable to get local issuer certificate. Причина: отсутствие корневого сертификата в системе или в CA-бандле.
Решение: укажите путь к CA-бандлу:
curl --cacert /path/to/ca-bundle.crt https://api.example.comИли обновите корневые сертификаты системы. Не рекомендуется отключать проверку сертификата (-k), это снижает безопасность.
Предотвращение повторных ошибок SSL/TLS
Автоматизация и мониторинг помогут избежать повторения проблем.
Автоматизация обновления сертификатов Let's Encrypt
Настройте cron для автоматического обновления:
0 3 * * * /usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx"Проверьте, что обновление работает, выполнив certbot renew --dry-run.
Мониторинг срока действия сертификатов
Используйте скрипты для проверки срока действия и отправки предупреждений. Пример скрипта на bash:
#!/bin/bash
DOMAIN="example.com"
EXPIRY=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
DAYS_LEFT=$(( ($(date -d "$EXPIRY" +%s) - $(date +%s)) / 86400 ))
if [ $DAYS_LEFT -lt 30 ]; then
echo "Сертификат $DOMAIN истекает через $DAYS_LEFT дней" | mail -s "SSL Expiry Warning" admin@example.com
fiИнтегрируйте проверку в системы мониторинга (Zabbix, Nagios) или используйте внешние сервисы для оповещений.
Заключение: чек-лист быстрой проверки SSL/TLS
При возникновении ошибки SSL/TLS выполните следующие шаги:
- Проверьте системное время на клиенте.
- Очистите кэш SSL в браузере.
- Проверьте срок действия сертификата:
openssl s_client ... | openssl x509 -noout -dates. - Проверьте цепочку доверия:
openssl s_client ... -showcerts. - Проверьте SAN:
openssl s_client ... | openssl x509 -noout -ext subjectAltName. - Если сертификат истек, обновите его (certbot или вручную).
- Настройте автоматическое обновление и мониторинг.
Регулярная проверка и автоматизация предотвращают большинство ошибок SSL/TLS. Используйте инструменты диагностики и следуйте рекомендациям для поддержания безопасности.