Введение
TLS (Transport Layer Security) и его предшественник SSL (Secure Sockets Layer) — это веб-протоколы, используемые для защиты и шифрования трафика в компьютерной сети.
Благодаря протоколам TLS/SSL серверы могут безопасно передавать трафик между сервером и клиентами, исключая возможность перехвата сообщений внешними сторонами. Система сертификации также помогает пользователям проверять подлинность сайтов, с которыми они взаимодействуют.
В этом руководстве вы настроите самоподписанный SSL-сертификат для использования с веб-сервером Nginx на сервере Ubuntu.
Предпосылки
- Прежде чем начать, у вас должен быть настроенный не-root пользователь с привилегиями sudo и включенным брандмауэром.
- Вам также необходимо установить веб-сервер Nginx.
- Если вы хотите установить на свой сервер полный стек LEMP (Linux, Nginx, MySQL, PHP).
Шаг 1 — Создание сертификата TLS
Протокол TLS/SSL использует комбинацию открытого сертификата и закрытого ключа. Ключ SSL хранится в секрете на сервере и шифрует контент, отправляемый клиентам. Сертификат SSL доступен всем, кто запрашивает этот контент. Его можно использовать для расшифровки контента, подписанного соответствующим ключом SSL.
Вы можете сгенерировать самоподписанную пару ключей и сертификат с помощью OpenSSL одной командой:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crtВот краткое описание того, что делает каждая часть этой команды:
судо: Команда sudo позволяет членам группы sudo временно повысить свои привилегии до уровня другого пользователя (по умолчанию суперпользователя или пользователя root). В данном случае это необходимо, поскольку мы создаём пару сертификата и ключа в каталоге /etc/, доступ к которой есть только у пользователя root или других привилегированных учётных записей.openssl: это основной инструмент командной строки для создания и управления сертификатами OpenSSL, ключами и другими файлами.запрос: Эта подкоманда указывает, что мы хотим использовать управление запросами на подпись сертификата (CSR) X.509. X.509 — это стандарт инфраструктуры открытых ключей, которому следуют SSL и TLS для управления ключами и сертификатами. Мы хотим создать новый сертификат X.509, поэтому используем эту подкоманду.- –
х509: Это изменяет предыдущую подкоманду, указывая, что мы хотим создать самоподписанный сертификат вместо создания запроса на подпись сертификата, как это обычно бывает. - –
узлы: Это указывает OpenSSL пропустить вариант защиты нашего сертификата парольной фразой. Нам нужно, чтобы Nginx мог читать файл без вмешательства пользователя при запуске сервера. Парольная фраза предотвращает это, поскольку её приходится вводить после каждой перезагрузки. -дней 365: Этот параметр определяет срок действия сертификата. Мы устанавливаем его равным одному году.-newkey rsa:2048: указывает, что мы хотим одновременно сгенерировать новый сертификат и новый ключ. Мы не создали ключ, необходимый для подписи сертификата на предыдущем шаге, поэтому нам нужно создать его вместе с сертификатом. Часть rsa:2048 указывает на необходимость создания ключа RSA длиной 2048 бит.-keyout: Эта строка указывает OpenSSL, где разместить сгенерированный нами файл закрытого ключа.-вне: Это указывает OpenSSL, где разместить создаваемый нами сертификат.
Как упоминалось ранее, эти параметры создают и файл ключа, и сертификат. После выполнения этой команды вам будет предложено ответить на несколько вопросов о вашем сервере, чтобы корректно встроить информацию в сертификат.
Введите команды правильно. Самая важная строка — та, где запрашивается общее имя (т.е. полное доменное имя сервера или ваше имя). Вам потребуется ввести доменное имя, связанное с вашим сервером, или, скорее всего, его публичный IP-адрес.
Вся команда будет выглядеть следующим образом:
Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.comОба созданных вами файла будут помещены в соответствующие подкаталоги каталога /etc/ssl.
При использовании OpenSSL вам также следует создать сильную группу Диффи-Хеллмана (DH), которая будет использовать полную прямую секретность при взаимодействии с клиентами.
Вы можете сделать это, набрав:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096Это займет некоторое время, но после завершения у вас будет сильная группа DH в /etc/nginx/dhparam.pem, которая будет использоваться во время настройки.
Шаг 2 — Настройте Nginx для использования SSL
Теперь, когда файлы ключа и сертификата созданы в каталоге /etc/ssl, вам нужно изменить конфигурацию Nginx для их использования.
Сначала вы создадите фрагмент конфигурации с информацией о местоположении ключа SSL и файла сертификата. Затем вы создадите фрагмент конфигурации с настройками надёжного SSL, который можно будет использовать с любыми будущими сертификатами. Наконец, вы настроите блоки сервера Nginx, используя два созданных вами фрагмента конфигурации, для корректной обработки SSL-запросов.
Такой метод настройки Nginx позволяет поддерживать чистоту серверных блоков и помещать общие разделы конфигурации в повторно используемые модули.
Создайте фрагмент конфигурации, указывающий на ключ SSL и сертификат.
Сначала создайте новый фрагмент конфигурации Nginx в папке /etc/nginx/snippets с помощью вашего любимого текстового редактора. В примере ниже используется nano.
Чтобы правильно обозначить назначение этого файла, назовите его self-signed.conf:
sudo nano /etc/nginx/snippets/self-signed.confВ этом файле необходимо указать директиву ssl_certificate для файла сертификата, а директиву ssl_certificate_key — для соответствующего ключа. Это будет выглядеть следующим образом:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;После добавления этих строк сохраните файл и выйдите из редактора. Если вы редактировали файл в nano, нажмите CTRL + X, Y, а затем ENTER.
Создайте фрагмент конфигурации с надежными настройками шифрования
Затем вы создаёте ещё один фрагмент, определяющий некоторые настройки SSL. Это настраивает Nginx на надёжный набор SSL-шифров и включает ряд расширенных функций, которые помогают обеспечить безопасность вашего сервера.
Заданные вами параметры можно будет повторно использовать в будущих конфигурациях Nginx, поэтому вы можете дать файлу универсальное имя:
sudo nano /etc/nginx/snippets/ssl-params.confДля безопасной настройки SSL в Nginx мы адаптировали рекомендации с сайта Cipherlist.eu. Cipherlist.eu — полезный и понятный ресурс для понимания настроек шифрования, используемых в популярном программном обеспечении.
Для ваших целей скопируйте в точности предоставленные настройки, но сначала вам нужно будет внести несколько небольших изменений.
Сначала добавьте предпочитаемый DNS-резолвер для восходящих запросов. В этом руководстве мы будем использовать Google (8.8.8.8 и 8.8.4.4).
Во-вторых, закомментируйте строку, содержащую заголовок Strict Transport Security. Прежде чем раскомментировать эту строку, ознакомьтесь с протоколом HTTP Strict Transport Security (HSTS), в частности с функцией предварительной загрузки. Предварительная загрузка HSTS обеспечивает дополнительную безопасность, но её случайное или неправильное включение может иметь серьёзные негативные последствия.
Добавьте следующее в файл фрагмента ssl-params.conf:
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 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";Поскольку вы используете самоподписанный сертификат, SSL-сшивание не будет использоваться. Nginx выведет предупреждение и отключит сшивание для нашего подписанного сертификата, но затем продолжит работать корректно.
Когда закончите, сохраните и закройте файл, нажав CTRL + X, а затем Y и ENTER.
Настройка Nginx для использования SSL
Теперь, когда у вас есть все необходимое, вы можете настроить конфигурацию Nginx, чтобы включить SSL.
В этом руководстве предполагается, что вы используете собственный файл конфигурации блока сервера в каталоге /etc/nginx/sites-available. В этом руководстве также соблюдаются правила, описанные в руководстве по предварительным требованиям Nginx, и в данном примере используется файл /etc/nginx/sites-available/your_domain. При необходимости замените имя своего файла конфигурации.
Прежде чем двигаться дальше, сделайте резервную копию текущего файла конфигурации:
sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bakТеперь откройте файл конфигурации, чтобы выполнить настройки:
sudo nano /etc/nginx/sites-available/your_domainВнутри ваш серверный блок, скорее всего, будет выглядеть примерно так:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
Ваш файл может иметь другой порядок, и вместо директив root и directory у вас могут быть директивы location, proxy_pass или другие пользовательские директивы конфигурации. Это нормально, поскольку вам нужно только обновить директивы listen и добавить SSL-компоненты. Затем измените существующий блок сервера для обслуживания SSL-трафика через порт 443 и создайте новый блок сервера для прослушивания порта 80 и автоматического перенаправления трафика на порт 443.
В существующем файле конфигурации обновите два оператора прослушивания, чтобы использовать порт 443 и ssl, а затем добавьте два файла фрагментов, созданных на предыдущих шагах:
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}Затем добавьте второй блок сервера в файл конфигурации после закрывающей фигурной скобки (}) первого блока:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}Это базовая конфигурация, которая прослушивает порт 80 и перенаправляет запросы на HTTPS. После завершения редактирования сохраните и закройте файл, нажав CTRL + X, затем Y и ENTER.
Шаг 3 — Настройка брандмауэра
Если вы включили брандмауэр UFW, как рекомендовано в руководстве по предварительным требованиям, вам потребуется изменить настройки, чтобы разрешить SSL-трафик. К счастью, Nginx регистрирует несколько профилей в UFW при установке.
Вы можете просмотреть доступные профили, введя:
sudo ufw app listПоявится список, подобный приведенному ниже:
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHТекущие настройки можно проверить, введя команду sudo ufw status:
sudo ufw statusВероятно, он выдаст следующий ответ, означающий, что на веб-сервер разрешен только HTTP-трафик:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)Чтобы разрешить HTTPS-трафик, вы можете обновить разрешения профиля «Nginx Full», а затем удалить дополнительное разрешение «Nginx HTTP»:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'После выполнения sudo ufw status вы должны получить следующий вывод:
sudo ufw statusOutput
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)Этот вывод подтверждает, что настройка брандмауэра успешно завершена, и вы готовы включить изменения в Nginx.
Шаг 4 — Активируйте изменения в Nginx
После завершения изменений и настроек брандмауэра вы можете перезапустить Nginx, чтобы применить новые изменения.
Для начала проверьте файлы на наличие синтаксических ошибок. Это можно сделать, выполнив команду sudo nginx -t:
sudo nginx -tЕсли все прошло успешно, вы получите результат, который выглядит примерно так:
Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulОбратите внимание на предупреждение в начале. Как упоминалось ранее, эта настройка вызовет предупреждение, поскольку ваш подписанный сертификат не может использовать SSL-шифрование. Это ожидаемо, и ваш сервер по-прежнему сможет корректно шифровать соединения.
Если ваш вывод соответствует нашему примеру, ваш файл конфигурации не содержит синтаксических ошибок. В этом случае вы можете безопасно перезапустить Nginx, чтобы изменения вступили в силу:
sudo systemctl restart nginxТеперь, когда система перезагрузилась с новыми изменениями, вы можете продолжить тестирование.
Шаг 5 – Тестирование шифрования
Теперь вы готовы протестировать свой SSL-сервер.
Откройте веб-браузер и введите https://, а затем доменное имя или IP-адрес вашего сервера в адресной строке:
В зависимости от вашего браузера вы можете получить предупреждение, поскольку созданный сертификат не был подписан одним из доверенных центров сертификации вашего браузера:
Это предупреждение ожидаемо и нормально. Нас интересует только шифрование нашего сертификата, а не сторонняя проверка учётных данных вашего хоста. Нажмите “Дополнительно”, а затем перейдите по предоставленной ссылке, чтобы перейти на ваш хост:
На этом этапе вы будете перенаправлены на свой сайт. В нашем примере в адресной строке браузера будет отображаться замок с крестиком “x”, что означает, что сертификат не может быть проверен. Шифрование соединения всё равно будет выполнено. Обратите внимание, что этот значок может выглядеть по-разному в зависимости от вашего браузера.
Если вы настроили Nginx с двумя серверными блоками, автоматически перенаправляя HTTP-контент на HTTPS, вы также можете проверить, правильно ли работает перенаправление:
Если в результате вы увидите тот же значок, это значит, что перенаправление сработало правильно.
Шаг 6 — Изменение на постоянное перенаправление
Если перенаправление работает правильно и вы уверены, что хотите разрешить только зашифрованный трафик, вам потребуется изменить конфигурацию Nginx, чтобы сделать перенаправление постоянным.
Снова откройте файл конфигурации блока сервера:
sudo nano /etc/nginx/sites-available/your_domainНайдите перенаправление 302 и измените его на перенаправление 301:
return 301 https://$server_name$request_uri;
Сохраните и закройте файл, нажав CTRL + X, затем Y и ENTER.
Проверьте настройки на наличие синтаксических ошибок:
sudo nginx -tКогда будете готовы, перезапустите Nginx, чтобы сделать перенаправление постоянным:
sudo systemctl restart nginxПосле перезагрузки изменения вступят в силу, и ваше перенаправление станет постоянным.
Результат
Вы настроили свой сервер Nginx на использование надёжного шифрования для клиентских подключений. Это позволяет безопасно обрабатывать запросы и предотвратить чтение вашего трафика третьими лицами. В качестве альтернативы вы можете использовать самоподписанный SSL-сертификат, который можно получить у Let's Encrypt — центра сертификации, который устанавливает бесплатные TLS/SSL-сертификаты и обеспечивает шифрование HTTPS на веб-серверах.











