SSL ставится на веб-сервере или в панели хостинга. Скрипт PHP сам сертификат не выпускает. Он должен открываться по https, отдавать куки нормально и не тащить картинки/скрипты по http — иначе смешанный контент и «странно не логинит».
Let’s Encrypt сейчас стандарт и на Beget/Timeweb, и на VDS через Certbot. Платный сертификат нужен редко — если требуют EV или особый wildcard-сценарий.
Shared-хостинг
В панели домена обычно есть раздел SSL / HTTPS. Включаете выпуск сертификата на домен (и www, если нужен). Ждёте выпуск — DNS уже должен смотреть на этот хостинг, иначе валидация падает.
Включите редирект http→https в панели, если есть галка. Если нет — через .htaccess на Apache:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
На Nginx редирект пишется в server-блоке на порту 80. Панель ISPmanager часто делает это сама.
VDS: Certbot и Nginx/Apache
Типичный путь для Nginx:
certbot --nginx -d example.com -d www.example.com
Для Apache — certbot --apache. Перед этим vhost на 80 должен отдавать сайт с правильным server_name. Иначе Certbot некуда вписать ssl-директивы.
Проверьте автообновление: certbot renew --dry-run. Сертификат на 90 дней; без renew сайт внезапно станет «небезопасным» через квартал. Связка сервера: Nginx + PHP-FPM, порты — firewall (443 снаружи открыт).
Что поправить в скрипте
- В настройках сайта URL с
https://. - Канонические ссылки и редиректы в админке, если есть.
- Контент в БД со старыми http-URL картинок — хотя бы критичные места.
Если после включения SSL админка открывается, а стили «без CSS» — в исходнике страницы ищите http:// на свои же ассеты. Браузер режет mixed content на https-странице.
Cookie с флагом Secure на чистом http не поедут — после перехода на https логин обычно наоборот стабилизируется. Локальная отладка https: HTTPS на локальном хосте.
www и голый домен
Сертификат должен покрывать оба имени, которыми пользуетесь, либо один канонический с редиректом. Иначе часть пользователей попадёт на имя без SSL. Выпустите SAN на оба или держите жёсткий редирект на одно имя до проверки сертификата.
Прокси и «HTTPS уже где-то»
Если перед сервером Cloudflare или балансер терминирует SSL, бэкенд может видеть http. Тогда скрипт иногда генерит http-ссылки. Смотрите заголовки X-Forwarded-Proto и настройки «HTTPS в панели Cloudflare». Ломать редиректами по кругу (CF→origin→CF) — классика бесконечного редиректа.
Ошибки выпуска
Не выпустился сертификат:
- DNS ещё не указал на этот сервер;
- порт 80 закрыт файрволом — HTTP-01 challenge не проходит;
- на домене отвечает другой vhost / заглушка хостера;
- лимит Let’s Encrypt по попыткам — подождите и не долбите кнопкой.
Симптом «сертификат есть, браузер ругается» — просрочен, неверное имя, или отдаёте цепочку без intermediate. Проверяйте не только сам cert, но и цепочку.
После включения — чеклист
- Главная по https без предупреждения.
- Редирект с http работает один раз, без петли.
- Кабинет, корзина, оплата — без mixed content.
- Админка и загрузка файлов.
- Cron и внешние вебхуки бьют на https-URL.
Установка скрипта с нуля: установка. Перенос на хост, где SSL уже был: перенос. Подбор сервера: хостинг или VDS.
HSTS
Заголовок HSTS имеет смысл, когда https стабильно работает. Включили слишком рано и сломали сертификат — браузеры клиентов запомнят «только https» и будут ругаться даже если вы временно откатились на http. На старте проекта HSTS можно отложить. На зрелом сайте — включить с разумным max-age.
Редиректы и www
Выберите канон: с www или без. Сертификат должен покрывать оба, либо редирект должен попадать на имя из сертификата. Иначе часть пользователей увидит предупреждение. В скрипте поле «URL сайта» должно совпадать с каноном — иначе генерация ссылок в письмах поедет.
Оплата и колбэки
Платёжки часто требуют https на return URL и webhook. После включения SSL обновите URL в кабинете ЮKassa/аналогов. Старый http-колбэк может перестать приниматься. Проверьте тестовый платёж после выкладки, не только замок в адресной строке.
Промежуточные сертификаты
Браузер ругается, а openssl с сервера показывает ok — иногда мобильные клиенты не дотягивают цепочку. Убедитесь, что fullchain отдаётся (в Certbot это обычно fullchain.pem). Панели иногда кладут только «сам» сертификат без intermediate.
Локальная отладка до боя
Имеет смысл один раз прогнать кабинет на локальном https: HTTPS на локалке, стек — MicroServer. Там же поймаете mixed content до прода.
Обновление и переезд
При переносе на новый VDS сертификат со старого сервера не «переезжает» сам. Выпускайте заново после DNS. Пока DNS не уехал, можно проверить новый сервер по hosts-файлу на http, затем переключить DNS и сразу certbot. Firewall должен пускать 80 для challenge: firewall. Веб на VDS: Nginx.
Если после SSL сайт в цикле редиректов — ищите двойной форс: и панель, и скрипт, и Cloudflare «Always HTTPS». Оставьте один слой. Ошибки 500 при этом смотрите отдельно: 500.
Проверка глазами и openssl
В браузере мало смотреть только замок. Откройте карточку сертификата: имя, срок, кем выдан. С сервера:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates -subject
Если subject не ваш домен — на IP отвечает чужой vhost. Чините server_name и порядок server-блоков в Nginx/Apache, не скрипт. После переноса домена с другого хостинга старый сертификат на старом IP никому не нужен — клиенты уже смотрят сюда.
Мониторинг срока сертификата рядом с uptime экономит внезапные «сайт небезопасен» в понедельник: мониторинг. Бэкап перед сменой панели/редиректов — по привычке: бэкап.
Частые вопросы
Как поставить ssl на php сайт?
Сертификат на хосте + редирект. В скрипте проверьте, что ссылки не остались на http.
Сколько времени занимает «SSL на PHP-сайте»?
Ориентир по тексту мануала — около 5 мин. На практике зависит от хостинга и подготовки базы.
Нужен ли отдельный сервер?
Для большинства скриптов достаточно хостинга или VDS с PHP и MySQL. Подбор сервера — в разделе VDS и требованиях к PHP/MySQL.
Установка готового скрипта php mysql?
Разбор рядом в мануале по этому запросу. установка готового скрипта php mysql
Требования php mysql для скрипта?
Разбор рядом в мануале по этому запросу. требования php mysql для скрипта