Представьте себе: я только что установил SSL-сертификат на свой сайт shadynagy.com. Всё выглядело отлично с моей стороны — сертификат был действителен, выдан Sectigo и имел достаточно времени до истечения срока действия (265 дней!). Но когда я провёл быструю проверку SSL на сайте WhyNoPadlock.com, я получил несколько разочаровывающих красных крестиков:
❌ Force HTTPS: Не принудительное использование SSL
❌ Invalid Intermediate: Отсутствует промежуточный (bundle) сертификат
Моё сердце упало. Какая польза от SSL-сертификата, если он не работает должным образом? Мои посетители могут видеть предупреждения о безопасности, поисковые системы могут ранжировать меня ниже, и что хуже всего — мой сайт может выглядеть непрофессионально.
Но вот хорошая новость: я всё исправил, и я покажу вам точно, как я это сделал, шаг за шагом.
Прежде чем приступить к решениям, давайте разберёмся, что на самом деле означают эти ошибки:
Что такое промежуточный сертификат?
Представьте SSL-сертификаты как цепочку доверия:
Ваш сайт должен отправлять КАК ваш сертификат, ТАК И промежуточный сертификат браузерам. Без промежуточного сертификата браузер не может проверить цепочку доверия.
Реальное влияние:
Что это означает?
Когда кто-то вводит http://shadynagy.com (без ‘s’), они должны автоматически перенаправляться на https://shadynagy.com. Без этого перенаправления:
Я обнаружил, что моя конфигурация nginx использовала неправильную директиву. Вот что у меня было:
# ❌ НЕПРАВИЛЬНАЯ КОНФИГУРАЦИЯssl_certificate /etc/nginx/ssl/shadynagy.com.crt;ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;
Проблема: ssl_trusted_certificate используется для OCSP stapling (функция производительности), а НЕ для отправки цепочки сертификатов браузерам!
Решение состоит в создании “fullchain” сертификата, который объединяет ваш сертификат с промежуточным сертификатом.
Команда:
cat /etc/nginx/ssl/shadynagy.com.crt /etc/nginx/ssl/shadynagy.com.ca-bundle > /etc/nginx/ssl/shadynagy.com-fullchain.crt
Что это делает:
cat - Конкатенирует (объединяет) файлы> - Выводит в новый файл с именем “fullchain”Объяснение на примере: Представьте, что у вас есть две части головоломки:
Вы склеиваете их вместе, чтобы создать одну полную головоломку, которую браузеры могут понять.
Откройте файл конфигурации SSL:
nano /etc/nginx/conf.d/shadynagy.com-ssl.conf
Обновите до этого:
server {listen 443 ssl http2; # Порт 443 с SSL и HTTP/2# ✅ ПРАВИЛЬНО - Используйте сертификат fullchainssl_certificate /etc/nginx/ssl/shadynagy.com-fullchain.crt;ssl_certificate_key /etc/nginx/ssl/shadynagy.com.key;# Опционально: Сохраните для OCSP stapling (повышение производительности)ssl_trusted_certificate /etc/nginx/ssl/shadynagy.com.ca-bundle;root /var/www/shady-nagy.com/html;index index.html index.htm;server_name shadynagy.com www.shadynagy.com;access_log /var/log/nginx/nginx.vhost.access.log;error_log /var/log/nginx/nginx.vhost.error.log;location / {try_files $uri $uri/ =404;}}
Объяснение ключевых изменений:
listen 443 ssl http2;
443 = Порт HTTPSssl = Включить SSLhttp2 = Включить HTTP/2 для лучшей производительностиssl on;ssl_certificate теперь указывает на fullchain вместо только вашего сертификата
ssl_trusted_certificate сохранён для OCSP stapling (опционально, но рекомендуется)
Протестируйте конфигурацию:
nginx -t
Ожидаемый вывод:
nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful
Если вы видите какие-либо ошибки, дважды проверьте пути к файлам и синтаксис!
Примените изменения:
systemctl reload nginx
Почему reload вместо restart?
reload применяет изменения без разрыва соединенийrestart ненадолго выведет ваш сайт из строяСначала я проверил мою конфигурацию HTTP:
cat /etc/nginx/conf.d/shadynagy.com.conf
Я обнаружил это:
# ❌ СЛОМАННАЯ КОНФИГУРАЦИЯserver {listen 80;root /var/www/shady-nagy.com/html;server_name shadynagy.com www.shadynagy.com;location / {try_files $uri $uri/ =404;}return 301 https://$server_name$request_uri; # Никогда не достигается!}
Проблема: Nginx читает конфигурации сверху вниз. Когда приходил запрос:
location /Это как поставить знак “Объезд” ПОСЛЕ дороги!
Исправление:
# ✅ ПРАВИЛЬНАЯ КОНФИГУРАЦИЯserver {listen 80;listen [::]:80; # Также слушать на IPv6server_name shadynagy.com www.shadynagy.com;# Перенаправить ВЕСЬ HTTP-трафик на HTTPSreturn 301 https://$host$request_uri;}
Что делает каждая часть:
listen 80; - Слушать HTTP-запросы (порт 80)listen [::]:80; - Также слушать IPv6 HTTP-запросыserver_name - К каким доменам это применяетсяreturn 301 - Отправить постоянное перенаправление (код статуса 301)$host - Домен, который ввёл пользователь (сохраняет www vs без-www)$request_uri - Путь, который они запросили (например, /about или /contact)Пример в действии:
Если кто-то посещает: http://www.shadynagy.com/how-i-fixed-ssl-certificate-issues-on-my-website-a-complete-guide
Они перенаправляются на: https://www.shadynagy.com/how-i-fixed-ssl-certificate-issues-on-my-website-a-complete-guide
Протестируйте конфигурацию:
nginx -t
Перезагрузите nginx:
systemctl reload nginx
Протестируйте перенаправление:
curl -I http://shadynagy.com
Ожидаемый вывод:
HTTP/1.1 301 Moved PermanentlyLocation: https://shadynagy.com/
Отлично! Но подождите…
Когда я тестировал в браузере, это всё равно не работало! После некоторого расследования:
firewall-cmd --list-all
Вывод:
services: https
Заметили, чего не хватает? HTTP (порт 80)!
Перенаправление было настроено идеально, но мой брандмауэр блокировал входящий HTTP-трафик. Это как установить входную дверь, но построить стену перед ней!
Добавьте сервис HTTP:
firewall-cmd --permanent --add-service=http
Перезагрузите брандмауэр:
firewall-cmd --reload
Убедитесь, что это сработало:
firewall-cmd --list-all
Теперь вы должны увидеть:
services: http https
Вот все команды, которые я использовал во время устранения неполадок:
# Найти все серверные блоки, слушающие порт 80grep -r "listen 80" /etc/nginx/# Проверить синтаксис конфигурации nginxnginx -t# Показать полную конфигурацию nginxnginx -T# Просмотреть конкретный серверный блокnginx -T 2>/dev/null | grep -A 15 "server_name shadynagy.com"
# Работает ли nginx?systemctl status nginx# Перезагрузить nginx (применить изменения без простоя)systemctl reload nginx# Перезапустить nginx (кратковременный простой)systemctl restart nginx# Проверить логи ошибокtail -20 /var/log/nginx/error.log
# Тестировать перенаправление (обходит кеш браузера)curl -I http://shadynagy.com# Следовать всем перенаправлениямcurl -IL http://shadynagy.com
# Слушает ли nginx на порту 80?ss -tlnp | grep :80# Слушает ли nginx на порту 443?ss -tlnp | grep :443
# Список всех правил брандмауэраfirewall-cmd --list-all# Добавить HTTP постоянноfirewall-cmd --permanent --add-service=http# Добавить HTTPS постоянноfirewall-cmd --permanent --add-service=https# Применить измененияfirewall-cmd --reload
