Установка SSL сертификата NGINX

Конфигурационный файл для сайта, обслуживаемого Nginx выглядит примерно приведенным ниже образом (подключается в данном случае бесплатный сертификат letsencrypt).

Устанавливать сертификат на Nginx требуется если этот пакет работает в качестве фронтенд сервера, если используется Apache — сертификат нужно устанавливать для Apache

Установка SSL сертификата NGINX

 

Настройка виртуального хоста Nginx для работы по https

 

Прежде всего генерируем последовательность Деффи-Хельмана, которая уникальна для сервера и позволит обеспечить лучшее шифрование (подробнее о TLS и Nginx).

openssl dhparam -out /etc/ssl/example.com.pem 2048

 

Создадим файл виртуального хоста

mcedit /etc/nginx/sites-availible/example.com

 

server {
listen 80;
listen 443 ssl;

add_header Strict-Transport-Security «max-age=63072000; preload»;
index index.php index.html index.htm;

if ($scheme = http) {
return 301 https://$server_name$request_uri;
}

server_name www.example.com example.com;

root /web/example.com/www;
access_log /var/log/nginx/example-access.log;
error_log /var/log/nginx/example-error.log;

charset utf-8;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers EECDH+ECDSA
+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+
ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM
:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;

location ~ /.well-known {
allow all;
}

include template/static.conf;
include template/some-template.conf;
}

 

 

Представленная выше структура весьма специфична — в общем виде файл виртуального хоста может выглядеть так (в качестве белого IP адреса сервера используется 123.123.123.123):

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_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»;
}
}

 

Переадресация всех запросов на https

Редирект реализован за счет добавления в конфигурационный файл приведенной ниже строки

return 301 https://$host$request_uri;

Или ее аналога в случае с letsencrypt

 

 

Сайт нужно активировать командой

ln -s /etc/nginx/sites-availible/example.com /etc/nginx/sites-enabled

 

Далее проверяем конфигурацию веб-сервера

nginx -t

 

Затем даем команду на перечитывание конфигурационных файлов

nginx -s reload

 

Проверяем все ли получилось

netstat -nltp

 

Nginx на порту 443 будет означать, что сервис работает так как нужно. Теперь можно проверять сайт — он будет доступен по https.

 

Защищенное соединение требуется не только для веб-сайтов, по нему также работает почта и всевозможные корпоративные сервисы. SSL сертификаты почти всегда платные, исключение — Let's encrypt, также имеющие недостаток в виде срока действия в 3 месяца.


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