Как вручную добавить S в HTTP?
Зачем оно вообще нужно?
HTTP — небезопасный протокол для общения. По своей природе сеть позволяет каждому получать все данные, которые транслируются любому другому пользователю. Поэтому все-все данные, которые вы получаете по HTTP, может прослушать любой другой человек, который подключен к вашей сети или к любой из сетей, соединяющие вас и сервер, с которым вы общаетесь.
Дело даже не в том, что передавать какие-то личные данные, вроде банковских карт, по HTTP небезопасно, дело в том, что злоумышленник может перехватывать пакеты, которые назначаются вам, и вместо них заслать какой-нибудь вредоносный/фишинговый прикол!
Так а S-то чем поможет?
С HTTPS дела обстоят немного по-другому: весь трафик между клиентом и сервером становится зашифрованным. Все пакеты с данными все ещё идут по потенциально небезопасным сетям в открытом виде, но вся информация в них расшифровывается только уникальным ключом, о котором мы с сервером договариваемся в момент открытия соединения. Не буду вдаваться в подробности алгоритмов работы шифрования, но расскажу, что нужно для того, чтобы включить HTTPS: сертификат.
Как работает сертификация
Сертификат — обычный файл, в котором содержится информация о том, кто его выдал, сколько он действителен, и открытый ключ, с помощью которого мы с сервером определяем новый симметричный ключ, которым будем шифровать весь проходящий трафик.
Информация о том, кто выдавал сертификат кажется лишней, но на самом деле благодаря ней мы понимаем, что сертификату можно доверять. На каждом нашем девайсе есть набор так называемых “корневых” сертификатов: все сертификаты, которые подписываются на их основе, становятся для нас доверенными. Мы можем сходить в центр сертификации корневого сертификата и убедиться в том, что он действителен. Да-да, наш веб всё ещё строится на доверии каким-то централизованным ребятам.
Вы также можете добавлять новые корневые сертификаты, если доверяете им: например, Сбер требует установки сертификатов Минцифры РФ. Если не хотите, чтобы Минцифры могло расшифровывать своими ключами весь трафик, который проходит с использованием их сертификатов — не советую.
Получение сертификата
Для того чтобы получить сертификат, нужно найти центр сертификации, который вам его выдаст. Самый популярный сервис для получения бесплатных сертификатов —letsencrypt.org. Есть даже CLI-клиент, который позволяет автоматизировать выдачу и продление сертификатов — certbot.
Для того чтобы letsencrypt понял, что мы владеем сайтом, он даст нам файл со специальным токеном, который он будет пытаться получить по адресу http://<наш домен>/.well-known/acme-challenge/TOKEN. Если мы получаем сертификат при помощи certbot, то он положит файл в /var/www/certbot.
Это единственный адрес, с которым мы продолжим работать по протоколу http; остальные запросы можем переадресовывать в https. С помощью NGINX это можно описать так:
Как только проверка завершится успешно, letsencrypt подпишет наш сертификат, и нам останется только подключить его к сайту:
Мы указали NGINX, что подключение к 443 порту шифруется с помощью SSL, а также указали путь к свежему сертификату и приватному ключу, с помощью которого мы будем начинать наше общение с клиентом.
Но сертификаты имеют свойство устаревать, а об их обновлении можно и забыть… Об автоматизации выпуска и обновлении сертификатов при помощи docker-compose и certbot поговорим в следующих двух статьях!