SSL
Не нужно покупать SSL ни у кого. Это развод чистой воды. SSL можно получить бесплатно, он будет ни чуть не хуже того, который вы получите за пару тысяч рублей в год.
Приступим к настройке ssl на наш домен. Использовать мы будем Certbot для установки SSL от Let’s Encrypt. В первую очередь добавляем репозиторий Certbot:
sudo add-apt-repository ppa:certbot/certbot
Далее устанавливаем его :
sudo apt install python-certbot-nginx
После того, как мы установили Certbot, нам нужно провести изменение конфигурационного файла Nginx. Тут то нам и понадобится WinSCP и root пользователь.
Заходим на рутованного пользователя в WinSCP и переходим сюда : /etc/nginx/sites-available

Нажимаем на файл default -> Открыть -> Выбираем VS Code

Полностью очищаем файл и добавляем следующий код:
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:18301;
}
}
Далее нам нужно перезарузить Nginx для применения новых конфигураций:
sudo service nginx restart
Так как мы не запускали API на VPS, Nginx будет выдавать такую ошибку:

Для того, чтобы избавиться от неё, нам нужно повесить API, которую мы писали на 18301 порт. На этом этапе вдаваться в процедуру подробно не будем. Скидываем все файлы api в папку нашего НЕ рутованного пользователя и запускаем, как обычно. После чего вместо 502 ошибки переход по ip или домену будет перенаправлять нас на API. Теперь пора приступать к установке сертификата:
sudo certbot --nginx -d example.com -d www.example.com
Certbot запросит у вас email, проверит действительно ли вам пренадлежит домен и после чего спросит у вас, как вы хотите построить конфигурацию Nginx. Нам это не важно, потому что мы будет переделывать её под себя, поэтому вибираем что угодно.
После получения SSL ключей нужно зайти опять в наш конфигурационный файл nginx
/etc/nginx/sites-available
и изменить весь код таким образом:
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:18301/;
}
}
И теперь разберём немного то, что мы тут делаем. Первый блок server будет принимать обычные http соединения на 80 порт и делать переадресацию на htts на 443 порт. Это даёт нам гарантию, что незащищённые соединения проходить не будут и в любом случае будет создано защищённое соединение:
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Далее у нас уже основной блок конфигурации, где мы обрабатываем все входящие запросы по защищённому соединению:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:18301/;
}
}
Параметр proxy_set_header
позволяет нашему api получить реальный ip и другие нужные данные пользователя, отправившего запрос. Без этих праметров api будет получать запросы с источником 127.0.0.1, что ограничивает нас в контроле.
Сам proxy_pass
указывает нам адрес api, на который перенаправляются запросы.
Так же сохраняем конфигурацию и перезагружаем Nginx:
sudo service nginx restart
Если мы всё сделали правильно, то теперь подключение к нашему api будет идти только через https.
Last updated
Was this helpful?