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

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


Введение

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

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

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

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

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

Предпосылки

Прежде чем начать, у вас должен быть пользователь без полномочий root, настроенный с привилегиями sudo. Вы можете узнать, как настроить такую учетную запись пользователя, следуя нашей первоначальной настройке сервера для Ubuntu 16.04.

Вам также потребуется установить веб-сервер Nginx. Если вы хотите установить на свой сервер весь стек LEMP (Linux, Nginx, MySQL, PHP), следуйте нашему руководству по настройке LEMP в Ubuntu 16.04.

Если вам просто нужен веб-сервер Nginx, вы можете вместо этого следовать нашему руководству по установке Nginx в Ubuntu 16.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

Вам будет задан ряд вопросов. Прежде чем мы перейдем к этому, давайте посмотрим, что происходит в команде, которую мы выдаем:

  • openssl: это основной инструмент командной строки для создания сертификатов, ключей и других файлов OpenSSL и управления ими.
  • req: эта подкоманда указывает, что мы хотим использовать управление запросом на подпись сертификата (CSR) X.509. «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/ssl/certs/dhparam.pem 2048

Это может занять несколько минут, но когда это будет сделано, у вас будет сильная группа DH по адресу /etc/ssl/certs/dhparam.pem, которую мы можем использовать в нашей конфигурации.

Шаг 2. Настройте Nginx для использования SSL

Мы создали файлы ключей и сертификатов в каталоге /etc/ssl. Теперь нам просто нужно изменить нашу конфигурацию Nginx, чтобы воспользоваться этими преимуществами.

Мы внесем некоторые коррективы в нашу конфигурацию.

  1. Мы создадим фрагмент конфигурации, содержащий наш ключ SSL и расположение файлов сертификатов.
  2. Мы создадим фрагмент конфигурации, содержащий надежные настройки SSL, которые в будущем можно будет использовать с любыми сертификатами.
  3. Мы настроим наши серверные блоки Nginx для обработки запросов SSL и будем использовать два приведенных выше фрагмента кода.

Этот метод настройки Nginx позволит нам сохранить чистые блоки сервера и поместить общие сегменты конфигурации в повторно используемые модули.

Создайте фрагмент конфигурации, указывающий на ключ SSL и сертификат

Во-первых, давайте создадим новый фрагмент конфигурации Nginx в каталоге /etc/nginx/snippets.

Чтобы правильно определить назначение этого файла, назовем его 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;

Когда вы добавите эти строки, сохраните и закройте файл.

Создайте фрагмент конфигурации с параметрами надежного шифрования

Далее мы создадим еще один фрагмент, который определит некоторые настройки SSL. Это установит Nginx с надежным набором шифров SSL и активирует некоторые расширенные функции, которые помогут обеспечить безопасность нашего сервера.

Параметры, которые мы установим, можно повторно использовать в будущих конфигурациях Nginx, поэтому мы дадим файлу общее имя:

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

Чтобы безопасно настроить Nginx SSL, мы будем использовать приведенные здесь рекомендации.

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

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

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

Во-первых, мы добавим предпочитаемый преобразователь DNS для исходящих запросов. Мы будем использовать Google для этого руководства. Мы также продолжим и установим параметр ssl_dhparam так, чтобы он указывал на созданный ранее файл Диффи-Хеллмана.

Наконец, вы должны уделить немного времени, чтобы прочитать о функции «предварительной загрузки». Предварительная загрузка HSTS обеспечивает повышенную безопасность, но может иметь далеко идущие последствия, если она случайно включена или включена неправильно. В этом руководстве мы не будем предварительно загружать настройки, но вы можете изменить это, если вы уверены, что понимаете последствия:

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
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 preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

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

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

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

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

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

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

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

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

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

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

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

    # SSL configuration

    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;

    . . .

Мы изменим эту конфигурацию, чтобы незашифрованные HTTP-запросы автоматически перенаправлялись на зашифрованный HTTPS. Это обеспечивает наилучшую безопасность для наших сайтов. Если вы хотите разрешить трафик HTTP и HTTPS, используйте следующую альтернативную конфигурацию.

Мы разделим конфигурацию на два отдельных блока. После двух первых директив listen мы добавим директиву server_name, указав доменное имя вашего сервера или, что более вероятно, IP-адрес. Затем мы настроим перенаправление на второй блок сервера, который мы будем создавать. После этого мы закроем этот короткий блок:

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

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

    # SSL configuration

    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;

    . . .

Далее нам нужно запустить новый блок сервера прямо под ним, чтобы содержать оставшуюся конфигурацию. Мы можем раскомментировать две директивы listen, которые используют порт 443. Мы можем добавить http2 к этим строкам, чтобы включить HTTP/2 в этом блоке. После этого нам просто нужно включить два файла фрагментов, которые мы создали:

Примечание. У вас может быть только одна директива listen, которая включает модификатор default_server для каждой версии IP и комбинации портов. Если для этих портов включены другие серверные блоки с установленным default_server, вы должны удалить модификатор из одного из блоков.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL configuration

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

    . . .

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

(Альтернативная конфигурация) Разрешить трафик HTTP и HTTPS

Если вы хотите или должны разрешить как зашифрованный, так и незашифрованный контент, вам придется настроить Nginx немного по-другому. Как правило, это не рекомендуется, если этого можно избежать, но в некоторых ситуациях это может быть необходимо. По сути, мы просто сжимаем два отдельных блока сервера в один блок и удаляем перенаправление:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;

    server_name server_domain_or_IP;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    . . .

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

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

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

Мы можем увидеть доступные профили, набрав:

  1. sudo ufw app list

Вы должны увидеть такой список:

Output
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

Вы можете увидеть текущую настройку, набрав:

  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», а затем удалить избыточный профиль «Nginx HTTP»:

  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'

Теперь ваш статус должен выглядеть так:

  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)

Шаг 4: Включите изменения в Nginx

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

Во-первых, мы должны убедиться, что в наших файлах нет синтаксических ошибок. Мы можем сделать это, набрав:

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

Обратите внимание на предупреждение в начале. Как отмечалось ранее, этот конкретный параметр выдает предупреждение, поскольку наш самозаверяющий сертификат не может использовать сшивание 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/default

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

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	server_name server_domain_or_IP;
	return 301 https://$server_name$request_uri;
}

. . .

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

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

  1. sudo nginx -t

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

  1. sudo systemctl restart nginx

Заключение

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