Поиск по сайту:

Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04


Введение

TLS, или безопасность транспортного уровня, и его предшественник SSL, что означает уровень защищенных сокетов, — это веб-протоколы, используемые для переноса обычного трафика в защищенную зашифрованную оболочку.

Используя эту технологию, серверы могут безопасно отправлять трафик между сервером и клиентами без возможности перехвата сообщений внешними сторонами. Система сертификатов также помогает пользователям проверять подлинность сайтов, к которым они подключаются.

В этом руководстве мы покажем вам, как настроить самозаверяющий сертификат SSL для использования с веб-сервером Nginx на сервере Ubuntu 18.04.

Примечание. Самоподписанный сертификат зашифрует связь между вашим сервером и любыми клиентами. Однако, поскольку он не подписан ни одним из доверенных центров сертификации (ЦС), включенных в веб-браузеры, пользователи не могут использовать сертификат для автоматической проверки подлинности вашего сервера.

Самоподписанный сертификат может подойти, если у вас нет доменного имени, связанного с вашим сервером, и в случаях, когда зашифрованный веб-интерфейс не открыт для пользователя. Если у вас есть доменное имя, во многих случаях лучше использовать сертификат, подписанный ЦС. Вы можете узнать, как настроить бесплатный доверенный сертификат с помощью проекта Let’s Encrypt здесь.

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 18.04, настроенный пользователем без полномочий root с правами sudo и брандмауэром. Вы можете узнать, как настроить такую учетную запись пользователя, следуя нашей первоначальной настройке сервера для Ubuntu 18.04.
  • Вам также потребуется установить веб-сервер Nginx. Если вы хотите установить на свой сервер весь стек LEMP (Linux, Nginx, MySQL, PHP), следуйте нашему руководству по настройке LEMP в Ubuntu 18.04.
  • Если вам нужен только веб-сервер Nginx, вы можете следовать нашему руководству по установке Nginx в Ubuntu 18.04.

Когда вы выполнили предварительные условия, перейдите к первому шагу.

Шаг 1 — Создание SSL-сертификата

TLS/SSL работает с использованием комбинации открытого сертификата и закрытого ключа. Ключ SSL хранится в секрете на сервере. Он используется для шифрования содержимого, отправляемого клиентам. SSL-сертификат общедоступен всем, кто запрашивает содержимое. Его можно использовать для расшифровки содержимого, подписанного соответствующим ключом SSL.

Вы можете создать пару самозаверяющих ключей и сертификатов с помощью OpenSSL с помощью одной команды:

  1. 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 позволяет членам группы sudo временно повысить свои привилегии до прав другого пользователя (суперпользователя или пользователь root по умолчанию). В данном случае это необходимо, так как мы создаем пару сертификата и ключа в каталоге /etc/, доступ к которому может получить только пользователь root или другие привилегированные учетные записи.
  • openssl: это основной инструмент командной строки для создания сертификатов, ключей и других файлов OpenSSL и управления ими.
  • req: эта подкоманда указывает, что мы хотим использовать управление запросом на подпись сертификата X.509 (CSR). X.509 — это стандарт инфраструктуры открытых ключей, которого придерживаются SSL и TLS при управлении ключами и сертификатами. Мы хотим создать новый сертификат X.509, поэтому мы используем эту подкоманду.
  • -x509: это еще больше изменяет предыдущую подкоманду, сообщая утилите, что мы хотим создать самозаверяющий сертификат вместо создания запроса на подпись сертификата, как это обычно происходит.
  • -nodes: указывает OpenSSL пропустить опцию защиты нашего сертификата с помощью парольной фразы. Нам нужно, чтобы Nginx мог прочитать файл без вмешательства пользователя при запуске сервера. Кодовая фраза предотвратит это, потому что нам придется вводить ее после каждого перезапуска.
  • -days 365: этот параметр устанавливает период времени, в течение которого сертификат будет считаться действительным. Здесь мы установили его на один год.
  • -newkey rsa:2048: указывает, что мы хотим сгенерировать новый сертификат и новый ключ одновременно. Мы не создали ключ, необходимый для подписи сертификата на предыдущем шаге, поэтому нам нужно создать его вместе с сертификатом. Часть rsa:2048 указывает ему создать ключ RSA длиной 2048 бит.
  • -keyout: эта строка указывает OpenSSL, куда поместить сгенерированный файл закрытого ключа, который мы создаем.
  • -out: сообщает 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 вам также следует создать сильную группу Диффи-Хеллмана, которая используется при согласовании совершенной прямой секретности с клиентами.

Вы можете сделать это, выполнив следующее:

  1. 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:

  1. 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, поэтому вы можете дать файлу общее имя:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Чтобы безопасно настроить Nginx SSL, мы адаптируем рекомендации от Cipherlist.eu — полезного и удобоваримого ресурса для понимания настроек шифрования, используемых для популярного программного обеспечения.

Примечание. Предлагаемые настройки Cipherlist.eu обеспечивают надежную защиту. Иногда это происходит за счет большей совместимости клиентов. Если вам нужна поддержка старых клиентов, существует альтернативный список, доступ к которому можно получить, щелкнув ссылку на странице с пометкой «Да, дайте мне набор шифров, который работает с устаревшим/старым программным обеспечением». При желании вы можете заменить этот список содержимым следующего примера блока кода.

Выбор используемой конфигурации будет во многом зависеть от того, что вам нужно поддерживать. Они оба обеспечат большую безопасность.

Для наших целей скопируйте предоставленные настройки полностью, но сначала вам нужно будет внести несколько небольших изменений.

Во-первых, добавьте предпочитаемый преобразователь DNS для исходящих запросов. В этом руководстве мы будем использовать Google (8.8.8.8 и 8.8.4.4).

Во-вторых, закомментируйте строку, устанавливающую строгий заголовок безопасности транспорта. Прежде чем раскомментировать эту строку, вы должны уделить минутку, чтобы прочитать о функциональности «предварительной загрузки». Предварительная загрузка 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 выдаст предупреждение, отключит сшивание для вашего самозаверяющего сертификата, но после этого продолжит работать правильно.

Сохраните и закройте файл, когда закончите.

Настройка конфигурации Nginx для использования SSL

Теперь, когда у вас есть фрагменты, вы можете настроить конфигурацию Nginx, чтобы включить SSL.

В этом руководстве предполагается, что вы используете собственный файл конфигурации блока сервера в каталоге /etc/nginx/sites-available. Это руководство также следует соглашениям из обязательного руководства по Nginx и использует в этом примере /etc/nginx/sites-available/your_domain. При необходимости замените имя файла конфигурации.

Прежде чем двигаться дальше, сделайте резервную копию вашего текущего файла конфигурации:

  1. sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak

Теперь откройте файл конфигурации, чтобы внести изменения:

  1. sudo nano /etc/nginx/sites-available/your_domain

Внутри ваш серверный блок, вероятно, начинается примерно так:

server {
    listen 80;
    listen [::]:80;

    server_name your_domain www.your_domain.com;

    root /var/www/your_domain.com/html;
    index index.html index.htm index.nginx-debian.html;

    . . .
}

Ваш файл может быть в другом порядке, и вместо директив root и index у вас может быть некое местоположение, proxy_pass или другие настраиваемые операторы конфигурации. Это нормально, так как вам нужно только обновить директивы listen и включить фрагменты SSL. Затем измените этот существующий блок сервера, чтобы он обслуживал трафик SSL через порт 443, и создайте новый блок сервера, чтобы он отвечал через порт 80 и автоматически перенаправлял трафик на порт 443.

Примечание. Используйте перенаправление 302, пока не убедитесь, что все работает правильно. После этого вы измените это на постоянное перенаправление 301.

В существующем файле конфигурации обновите два оператора listen, чтобы использовать порт 443 и ssl, а затем включите два файла фрагментов, которые мы создали на предыдущих шагах. :

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    server_name your_domain.com www.your_domain.com;

    root /var/www/your_domain.com/html;
    index index.html index.htm index.nginx-debian.html;

    . . .
}

Затем добавьте второй блок server в файл конфигурации после закрывающей скобки () первого блока:

. . .
server {
    listen 80;
    listen [::]:80;

    server_name your_domain.com www.your_domain.com;

    return 302 https://$server_name$request_uri;
}

Это базовая конфигурация, которая прослушивает порт 80 и выполняет перенаправление на HTTPS. Сохраните и закройте файл, когда закончите его редактирование.

Шаг 3 — Настройка брандмауэра

Если у вас включен брандмауэр ufw, как рекомендовано в руководствах по предварительным требованиям, вам необходимо изменить настройки, чтобы разрешить трафик SSL. К счастью, Nginx регистрирует несколько профилей в ufw при установке.

Вы можете просмотреть доступные профили, выполнив следующее:

  1. sudo ufw app list

На выходе появится список, подобный следующему:

Output
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

Вы также можете проверить текущую настройку, введя sudo ufw status:

  1. 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»:

  1. sudo ufw allow 'Nginx Full'

Затем удалите лишнее разрешение профиля \Nginx HTTP:

  1. sudo ufw delete allow 'Nginx HTTP'

После запуска sudo ufw status вы должны получить следующий вывод:

  1. sudo ufw status
Output
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:

  1. 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, чтобы изменения вступили в силу:

  1. sudo systemctl restart nginx

Теперь, когда система перезапущена с новыми изменениями, можно переходить к тестированию.

Шаг 5 — Тестирование шифрования

Теперь вы готовы протестировать свой SSL-сервер.

Откройте веб-браузер и введите https://, а затем доменное имя или IP-адрес вашего сервера в адресную строку:

https://server_domain_or_IP

В зависимости от вашего браузера вы, скорее всего, получите предупреждение, поскольку созданный вами сертификат не подписан ни одним из доверенных центров сертификации вашего браузера:

Это предупреждение является ожидаемым и нормальным. Нас интересует только аспект шифрования нашего сертификата, а не сторонняя проверка подлинности нашего хоста. Нажмите «ДОПОЛНИТЕЛЬНО», а затем ссылку, предоставленную для перехода к вашему хосту:

В этот момент вы должны попасть на свой сайт. В нашем примере в адресной строке браузера отображается замок со знаком «x» над ним, что означает, что сертификат не может быть проверен. Он по-прежнему шифрует ваше соединение. Обратите внимание, что этот значок может отличаться в зависимости от вашего браузера.

Если вы настроили Nginx с двумя серверными блоками, автоматически перенаправляющими HTTP-контент на HTTPS, вы также можете проверить, правильно ли работает перенаправление:

http://server_domain_or_IP

Если это приводит к тому же значку, это означает, что ваше перенаправление сработало правильно.

Шаг 6 — Переход на постоянное перенаправление

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

Снова откройте файл конфигурации блока сервера:

  1. sudo nano /etc/nginx/sites-available/your_domain.com

Найдите return 302 и измените его на return 301:

	return 301 https://$server_name$request_uri;

Сохраните и закройте файл.

Проверьте конфигурацию на наличие синтаксических ошибок:

  1. sudo nginx -t

Когда будете готовы, перезапустите Nginx, чтобы перенаправление стало постоянным:

  1. sudo systemctl restart nginx

После перезагрузки изменения вступят в силу, и ваш редирект станет постоянным.

Заключение

Вы настроили свой сервер Nginx для использования надежного шифрования для клиентских подключений. Это позволит вам безопасно обслуживать запросы и не позволит сторонним сторонам читать ваш трафик. В качестве альтернативы вы можете использовать самозаверяющий сертификат SSL, который можно получить в Let’s Encrypt, центре сертификации, который устанавливает бесплатные сертификаты TLS/SSL и включает зашифрованный HTTPS на веб-сервере. Узнайте больше из нашего руководства о том, как защитить Nginx с помощью Let’s Encrypt в Ubuntu 18.04.