Перевести сайт с HTTP на HTTPS — дело двух минут. Прикрутил сертификат, включил редирект, готово. Примерно так я себе это и представлял, когда в понедельник затеял миграцию с HTTP на HTTPS на nginx. К концу недели за плечами были mixed content, redirect loop, сертификат, протухший в три часа ночи в субботу, и решение про HSTS preload, которое уже не отменить. Две минуты превратились в двухдневное обучение, которого я не планировал.
Вот что происходит, когда делаешь это по-настоящему.
Схема выглядит элементарно
Nginx стоит на краю как reverse proxy. SSL termination — на нём же. Let's Encrypt выдаёт сертификат. Добавляешь пару security-заголовков и считаешь, что всё безопасно. На бумаге — четыре шага. За каждым прячется своя засада.
- Цепочка сертификатов должна быть в правильном порядке. Ошибёшься — и половина клиентов доверяет серту, а вторая половина ловит ошибки, которые ты не воспроизведёшь у себя на ноутбуке.
- Security-заголовки — HSTS, Content-Security-Policy, X-Frame-Options — каждый меняет поведение браузера так, что это вылезает только в проде.
- Автопродление — это cron, который пишешь один раз и больше в него не заглядываешь. Вот тут и капкан.
Засады, которые сожрали мне неделю
Mixed content. Замочек пропал, потому что одна картинка всё ещё грузилась по http://. Одна-единственная. Зашита в inline CSS, и браузер не говорит, какой именно ресурс, — он молча понижает твой значок замка и пишет warning в консоль, которую никто не держит открытой. Mixed content прячется в инлайновых стилях и сторонних скриптах, про которые ты давно забыл.
Redirect loops. Я отправлял HTTP на HTTPS, а что-то дальше по цепочке возвращало обратно на HTTP, и браузер крутился до бесконечности. Так бывает, когда nginx терминирует TLS, а приложение за ним всё ещё думает, что отдаёт обычный HTTP, и городит свой редирект. X-Forwarded-Proto существует ровно для этого — и я это выучил через петлю.
Протухший серт. Не на настройке — а месяцы спустя. Вот про эту часть забывают почти все. Тебя роняет не первичный конфиг. Тебя роняет второе или третье продление, когда cron тихо падает, а никто не проверяет — ну зачем проверять то, что в прошлый раз сработало. Сайт ложится субботним утром, и ты в семь утра в трусах дебажишь Let's Encrypt. Спроси, откуда я знаю.
HSTS preload — дверь без ручки с обратной стороны
Вот это напугало сильнее всего. HSTS говорит браузерам: «со мной только по HTTPS, и точка». Preload-список зашивает это правило прямо внутрь самого браузера. Отправляешь домен, чувствуешь себя ответственным и защищённым — и понимаешь, что кнопки «отменить» больше нет. Сломаешь HTTPS после этого — и сайт не «показывает страшный warning». Он реально недоступен. Браузеры просто отказываются подключаться. Отправляй домен туда только когда действительно уверен.
Как выглядит «сделано правильно»
Когда я перестал гадать и начал это инженерить, результат вышел чистый:
- A+ на SSL Labs — против C, который дефолтный конфиг nginx выдаёт из коробки.
- 100% покрытие HTTPS, ноль mixed content, ноль ошибок безопасности в браузере.
- Разница между тем C и этим A+ — примерно 20 строк конфига: TLS 1.2 и выше, сильные cipher suites, HSTS, OCSP stapling. Тот же nginx, тот же сертификат — просто не дефолты.
И то, что мне дороже всего: runbook. Каждая засада задокументирована, продление проверено до того, как оно реально понадобилось, на срок жизни серта повешен мониторинг — чтобы следующий сбой был алертом, а не аварией. Инженер, которому это достанется, не будет проклинать цепочки сертификатов все выходные.
HTTPS — это пол, а не потолок
«Просто» в инфраструктуре означает «просто, если ты уже один раз совершил все ошибки». Для остальных HTTPS — это система, а не галочка: управление сертификатами, автоматизация продления, харденинг заголовков, цепочки редиректов — всё это инженерят, а не «включают тумблером».
HTTPS — не фича, которую ты выкатываешь. Это тот минимум, который ты должен пользователям в 2026-м. И, честно, вот этот разрыв — относиться к нему как к системе, а не как к переключателю — и есть большая часть того, что отличает того, кто делает сайты, от того, кто делает инфраструктуру.
Какая миграция звучала «просто», пока ты реально за неё не взялся?