Вы не спрашивали "зачем SSL", но для тех кто этот пост будут читать, скажу что уже наверное лет 10 как безопасность оказалась в центре внимания, и теперь каждая компания сталкивается с тем фактом, что их веб-серверы должны безопасно обслуживать контент. Так что тема актуальная - без SSL даже поисковые системы вроде гугла и яндекса ставят сайт ниже в выдаче.
Что потребуется
Для этого вам понадобится NGINX, работающий на вашем сервере, с готовым подписанным сертификатом. Поскольку у вас уже есть Ubuntu и NGINX, сразу перейдем к процессу создания самоподписанного сертификата (самый дешевый и простой способ - что бы научиться настраивать SSL, настоящий сертификат нам не нужен).
Самоподписанный сертификат
Первым шагом является создание вашего самоподписанного сертификата. Для этого войдите на сервер по SSH (примечание - здесь можно узнать как настроить авторизацию SSH без пароля) и введите следующую команду:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
Вам будет задано несколько вопросов (например, название страны, штат, местность и т. Д.). Самый важный вопрос - общее имя (common name). На этот вопрос укажите IP-адрес сервера (либо имя домена на котором будер работать ваш вебсайт, если есть).
После завершения команды необходимые файлы будут добавлены в каталог /etc/ssl
Настройка NGINX
Теперь нам нужно настроить NGINX для использования SSL. Сначала создайте новый файл конфигурации с помощью команды:
sudo vim /etc/nginx/snippets/self-signed.conf
В этот новый файл добавьте следующее содержимое:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Сохраните и закройте этот файл. Если вы не знакомы с редактором vim, можете использовать любой другой инструмент для редактирования текста. Как сохранить файл в vim рассказано здесь.
Затем создайте второй фрагмент конфигурации, который указывает на наш недавно сгенерированный ключ SSL и сертификат. Для этого выполните команду:
sudo vim /etc/nginx/snippets/ssl-params.conf
Добавьте в этот файл такое содержимое:
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/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 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
Поскольку мы используем самоподписанный сертификат, мы отключаем опцию "stapling SSL" (метод для быстрого и безопасного определения того, является ли сертификат SSL действительным). Если вы не используете самоподписанный сертификат, удалите символы # перед двумя строками. Вы также можете изменить строку предпочитаемых DNS-серверов (в примере указаны открытые DNS сервера Гугла). Сохраните и закройте этот файл.
Нам также нужно сгенерировать файл dhparam.pem с помощью команды:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Команда, указанная выше может занять немножко времени, так что не стоит переживать что все зависло. Просто ждем.
Следующим шагом будет настройка NGINX с использованием SSL. Предположим, у вас есть серверный блок для example.com. Откройте этот блок сервера с помощью команды:
sudo vim /etc/nginx/sites-available/example.com
Отредактируйте этот файл и добавьте такие строки:
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm index.nginx-debian.html;
}
Ниже добавьте другой блок конфига (для перенаправления HTTP -> HTTPS, т.е. что бы сайт был доступен ТОЛЬКО по SSL):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 302 https://$server_name$request_uri;
}
И напоследок нужно слинковать файлы sites-available с sites-enabled:
ln -s /etc/nginx/sites-available/www.example.com /etc/nginx/sites-enabled/
Пара слов про символические ссылки здесь (для тех кто интересуется).
Важный шаг - перед тем как переходить дальше с настройкой, рекомендую убедиться что конфиг NGINX не содержит ошибок. Для этого проверим синтаксис конфигурационного файла командой:
sudo nginx -t
Если все ок, вы должны увидеть примерно такой вывод:
Output
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
Убедимся что все работает
Используя ufw, мы можем поддержку SSL с помощью команды:
sudo ufw app list
Из вывода этой команды должно быть видно что NGINX имеет поддержку HTTPS. Примерно это выглядит так:
Available applications:
Dovecot IMAP
Dovecot POP3
Dovecot Secure IMAP
Dovecot Secure POP3
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Postfix
Postfix SMTPS
Postfix Submission
Теперь осталось перезагрузить NGINX:
sudo systemctl restart nginx
Теперь вы сможете указать браузеру https://SERVER_IP (где SERVER_IP - это IP-адрес вашего сервера) и увидеть предупреждение о безопасности сертификата (т.к. мы используем самоподписанный сертификат).
Это ожидаемо и вполне нормально. Нас интересует только аспект шифрования нашего сертификата, а не проверка третьей стороной подлинности хоста. Нажмите «ADVANCED», а затем предоставленную ссылку, чтобы в перейти к вашему хосту:
Вы должны после этого перейти на свой сайт. Если вы посмотрите в адресную строку браузера, вы увидите некоторые признаки "частичной безопасности". Это может быть значок с «х» над ним или треугольник с восклицательным знаком. В этом случае это просто означает, что сертификат не может быть проверен. Однако ж ваше соединение защищено SSL.