Настройка балансировщика для работы с самоподписанными сертификатамиСоздание самоподписанного SSL-сертификатаДля создания самоподписанного SSL-сертификата и ключа к нему нужно: |
выполнить генерацию SSL-сертификата (/etc/ssl/certs/nginx-selfsigned.crt) и ключа к нему (/etc/ssl/private/nginx-selfsigned.key):
:~$ sudo openssl req -new -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt |
Используемые ключи команды:
openssl - базовый инструмент командной строки для создания и управления сертификатами, ключами и другими файлами OpenSSL;req - эта опция указывает, что на данном этапе нужно использовать запрос на подпись сертификата X.509 (CSR). X.509 – это стандарт инфраструктуры открытого ключа, которого придерживаются SSL и TLS при управлении ключами и сертификатами. Данная команда позволяет создать новый сертификат X.509;new - эта опция указывает, что будет создаваться новый запрос;x509 - эта опция вносит поправку в предыдущую команду, сообщая утилите о том, что вместо запроса на подписание сертификата необходимо создать самоподписанный сертификат;nodes - ключ для пропуска опции защиты сертификата парольной фразой. Нужно, чтобы при запуске балансировщик нагрузки (nginx) имел возможность читать файл без вмешательства пользователя. Установив пароль, придется вводить его после каждой перезагрузки;days 365 - эта опция устанавливает срок действия сертификата (в данном случае сертификат действителен в течение года);newkey rsa:2048 - эта опция позволяет одновременно создать новый сертификат и новый ключ. Поскольку ключ, необходимый для подписания сертификата, не был создан ранее, нужно создать его вместе с сертификатом. Данная опция создаст RSA-ключ размером 2048 бит;keyout - эта опция сообщает OpenSSL, куда поместить сгенерированный файл ключа;out - эта опция сообщает OpenSSL, куда поместить созданный сертификат.После исполнения команды надо последовательно ввести ряд параметров, запросы на которые отобразятся в командной строке:
Country Name (2 letter code) [AU];State or Province Name (full name) [Some-State];Locality Name (eg, city) [];Organization Name (eg, company) [Internet Widgits Pty Ltd];Organizational Unit Name (eg, section) [];Common Name (e.g. server FQDN or YOUR name) [];Email Address [].Наиболее важным параметром является Common Name (необходимо ввести FQDN-имя балансировщика). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, нужно внести в эту строку IP-адрес сервера.
Файлы ключа и сертификата будут размещены в каталоге, указанном при вызове команды openssl в параметрах keyout и out.
При использовании OpenSSL необходимо также создать ключи Диффи-Хеллмана, для этого:
сгенерировать ключи Диффи-Хеллмана длиной 4096 бит и сохранить их в файл /etc/nginx/dhparam.pem:
:~$ sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096 |
Настройка nginx для поддержки SSLДля настройки nginx нужно: |
/etc/nginx/snippets для указания размещения сертификата и ключа::~$ sudo touch /etc/nginx/snippets/self-signed.conf |
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; |
:~$ sudo touch /etc/nginx/snippets/ssl-params.conf |
ssl-params.conf, приведя его к виду:ssl_protocols TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparam.pem; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0 ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # Requires nginx >= 1.5.9 ssl_stapling on; # Requires nginx >= 1.3.7 ssl_stapling_verify on; # Requires nginx => 1.3.7 resolver 77.88.8.8 77.88.8.1 valid=300s; resolver_timeout 5s; # Disable strict transport security for now. You can uncomment the following # line if you understand the implications. # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; |
Поскольку сертификат является самоподписанным, |
Конфигурирование веб-сервераДля конфигурирования веб-сервера нужно: |
:~$ sudo touch /etc/nginx/sites-available/sampledomain.ru.conf |
upstream daas-upstream-ws {
least_conn;
# PROXY TERMIDESK
server 192.168.0.41:5099;
server 192.168.0.42:5099;
server 192.168.0.43:5099;
server 192.168.0.44:5099;
}
upstream daas-upstream-nodes {
least_conn;
# DISPATCHER TERMIDESK
server 192.168.0.30;
server 192.168.0.31;
server 192.168.0.32;
}
server {
listen 0.0.0.0:80;
listen 0.0.0.0:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
location /websockify {
# limit_req zone=fast nodelay;
proxy_http_version 1.1;
proxy_pass http://daas-upstream-ws/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Connection timeout
proxy_connect_timeout 1000;
proxy_send_timeout 1000;
proxy_read_timeout 1000;
send_timeout 1000;
# Disable cache
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://daas-upstream-nodes/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
} |
IP-адреса, перечисленные в директиве |
/etc/nginx/sites-available в директорию /etc/nginx/sites-enabled, чтобы nginx его обслуживал::~$ sudo ln -s /etc/nginx/sites-available/sampledomain.ru.conf /etc/nginx/sites-enabled/ |
:~$ sudo nginx -t |
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
Веб-сервер возвращает предупреждение в случае использования самоподписанного сертификата, однако соединения будут шифроваться правильно. |
:~$ sudo systemctl restart nginx |