SSL

Не нужно покупать SSL ни у кого. Это развод чистой воды. SSL можно получить бесплатно, он будет ни чуть не хуже того, который вы получите за пару тысяч рублей в год.

Для настройки SSL нужно приобрести домен. Его можно взять за пару сотен у того же reg.ru.

Приступим к настройке 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

Нам нужен root только для редактирования файлов через vs code! Остальные действия выполняем из под обычного юзера.

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

Полностью очищаем файл и добавляем следующий код:

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
       proxy_pass http://127.0.0.1:18301;
  }
}

Где example.com и www.example.com ваш домен, а http://127.0.0.1:18301 локальный адрес к API.

Далее нам нужно перезарузить Nginx для применения новых конфигураций:

sudo service nginx restart

Так как мы не запускали API на VPS, Nginx будет выдавать такую ошибку:

Для того, чтобы избавиться от неё, нам нужно повесить API, которую мы писали на 18301 порт. На этом этапе вдаваться в процедуру подробно не будем. Скидываем все файлы api в папку нашего НЕ рутованного пользователя и запускаем, как обычно. После чего вместо 502 ошибки переход по ip или домену будет перенаправлять нас на API. Теперь пора приступать к установке сертификата:

sudo certbot --nginx -d example.com -d www.example.com

Где example.com и www.example.com – ваш домен.

Certbot запросит у вас email, проверит действительно ли вам пренадлежит домен и после чего спросит у вас, как вы хотите построить конфигурацию Nginx. Нам это не важно, потому что мы будет переделывать её под себя, поэтому вибираем что угодно.

После получения SSL ключей нужно зайти опять в наш конфигурационный файл nginx

/etc/nginx/sites-available

и изменить весь код таким образом:

Сразу предупрежджаю о том, что лучше всего скопировать блок с четырмя параметрами из файла, который был сконфигурирован сразу, так как путь к сертификатам может отличаться от моего примера.

ssl_certificate ssl_certificate_key include ssl_dhparam

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?