Рассмотрим как выполняется установка SSL сертификата для nginx. Будем использовать бесплатный сертификат letsencrypt.
Устанавливать сертификат на Nginx требуется если этот пакет работает в качестве фронтенд сервера, если используется Apache — сертификат нужно устанавливать для Apache
Прежде всего генерируем последовательность Деффи-Хельмана, которая уникальна для сервера и позволит обеспечить лучшее шифрование (подробнее о TLS и Nginx).
openssl dhparam -out /etc/ssl/example.com.pem 2048
Создадим файл виртуального хоста
mcedit /etc/nginx/sites-availible/example.com
server { listen 123.123.123.123:80; server_name example.com www.example.com ; return 301 https://$host$request_uri; rewrite ^ https://example.com$request_uri? permanent; } server { listen 123.123.123.123:443; server_name example.com www.example.com ; charset UTF-8; access_log off; error_log /var/log/nginx/error.log notice; ssl on; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; ssl_dhparam /etc/ssl/example.com.pem; ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; add_header Strict-Transport-Security "max-age=31536000;"; include static.conf; location / { root /web/example.com/www; proxy_pass http://127.0.0.1:80; proxy_redirect http://127.0.0.1:80/ /; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 120; proxy_send_timeout 120; proxy_read_timeout 180; $proxy_add_x_forwarded_for; proxy_set_header HTTPS "on"; proxy_set_header X-Forwarded-Proto "https"; } }
Сгенерированный ранее /etc/ssl/example.com.pem подключаем директивой ssl_dhparam. Этот шаг необязателен, но dhparam даст больший уровень защищенности.
В качестве публичного IP адреса сервера используется 123.123.123.123. Адрес нужно задавать если сайт на сервере один или если для других сайтов также задан адрес. Если нет, то нужно указывать просто listen 443;
Директивами ssl_certificate_key и ssl_certificate заданы пути к файлам сертификата и приватного ключа. Сами сертификаты можно получить запустив certbot с ключом certonly.
К конфигурации указан домен example.com, путь к каталогу /web/example.com/www и адрес 127.0.0.1:80 для перенаправления запросов бэкенду.
Для других сайтов все эти параметры будут индивидуальны.
Для работы сервиса указан порт 443. С порта 80 (http) выполняется переадресация на https.
Переадресация всех запросов на https при установке SSL сертификата на Nginx
Редирект реализован за счет добавления в конфигурационный файл приведенной ниже строки
return 301 https://$host$request_uri;
Сайт нужно активировать командой
ln -s /etc/nginx/sites-availible/example.com /etc/nginx/sites-enabled
Далее проверяем конфигурацию веб-сервера
nginx -t
Затем даем команду на перечитывание конфигурационных файлов
nginx -s reload
Проверяем все ли получилось
netstat -nltp
Процесс Nginx на порту 443 будет означать, что сервис работает так как нужно. Теперь можно проверять сайт — он будет доступен по протоколу https и браузер будет принимать SSL сертификат.
Мы рассмотрели как выполняется установка SSL сертификата для nginx.
Защищенное соединение требуется не только для веб-сайтов, по нему также работает почта и всевозможные корпоративные сервисы. SSL сертификаты почти всегда платные, исключение — Let's encrypt, также имеющие недостаток в виде срока действия в 3 месяца (про обновление в автоматическом режиме).
Если непосредственно клиенты с сервисом не взаимодействуют и предупреждение о недоверенном сертификате не критично, его можно сгенерировать самостоятельно.