Как создать и использовать самоподписанный SSL в Nginx — CloudSavvy IT

Логотип Nginx

Если вам просто требуется шифрование для внутренних подключений к серверу или сайтов, не предназначенных для пользователей, подпись собственных сертификатов SSL — это простой способ избежать работы с внешним центром сертификации. Вот как это настроить в nginx.

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

Создать и самостоятельно подписать сертификат SSL

Для этого мы будем использовать openssl утилита. Скорее всего, это уже установлено, так как это зависимость от Nginx. Но если чего-то не хватает, вы можете установить его из диспетчера пакетов вашего дистрибутива. Для систем на основе Debian, таких как Ubuntu, это будет:

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

sudo apt-get install openssl

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

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt

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

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []: your_ip_address
Email Address []:

Это займет секунду, чтобы сгенерировать новый закрытый ключ RSA, используемый для подписи сертификата, и сохранить его в /etc/ssl/private/nginx.key, Сам сертификат хранится в /etc/ssl/certs/nginx.crtи действует в течение всего года.

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

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

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

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

Чтобы упростить задачу, мы поместим всю конфигурацию в файл сниппета, который мы можем включить в наш nginx. server блоки. Создайте новый фрагмент конфигурации в nginx snippets каталог:

touch /etc/nginx/snippets/self-signed.conf

Откройте его в вашем любимом текстовом редакторе и вставьте следующее:

ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
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_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;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ecdh_curve secp384r1;

Первые две строки этого фрагмента настраивают nginx на использование нашего собственного сертификата и нашего личного ключа. Следующий блок — это общие настройки SSL, и, наконец, две последние строки настраивают nginx для использования нашей группы Диффи-Хеллмана для прямой защиты. Вы можете пропустить это, если не хотите ждать.

Единственное, что нужно включить, это HTTP Strict Transport Security, который настраивает ваш сайт на постоянное использование SSL. Это потребует постоянного перенаправления с HTTP на HTTPS, поэтому перед включением убедитесь, что SSL работает.

Теперь измените вашу основную конфигурацию nginx (обычно находится по адресу /etc/nginx/nginx.conf для отдельных сайтов или под вашим доменным именем в /etc/nginx/sites-available для многосайтовых серверов) и исходный код:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    include snippets/self-signed.conf;

    server_name example.com www.example.com;
    . . .
}

Вы также захотите настроить перенаправление с HTTP на HTTPS, что вы можете сделать с дополнительным блоком сервера, прослушивающим порт 80:

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

    server_name example.com www.example.com;

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

Это редирект 302, который является только временным. Вы захотите переключить это на 301, если все работает правильно.

Проверьте свою конфигурацию, перезапустив nginx:

sudo service nginx restart

Поскольку трафик HTTPS использует порт 443, вам необходимо настроить брандмауэры, чтобы разрешить передачу через этот порт. Если вы используете Iptables или UFW, вам нужно будет открыть порты из командной строки. Если вы используете хостинговую службу, такую ​​как AWS, которая имеет встроенный межсетевой экран, вам также необходимо открыть их через их веб-интерфейс.

Интерфейс брандмауэра AWS

Если ваша служба работает полностью внутри вашей локальной сети, вы можете захотеть внести в белый список вашу конкретную подсеть IP-адресов, чтобы отключить доступ извне локальной сети и получить доступ к вашим серверам через VPN-соединение.

Если все работает правильно, теперь вы сможете получить доступ к вашему серверу через HTTPS. Ваш веб-браузер может отображать следующее предупреждение:

предупреждение SSL chrome

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

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

Убедившись в отсутствии проблем с SSL, вы можете переключить перенаправление HTTP на перенаправление 301:

return 301 https://$server_name$request_uri;

И перезапустите nginx, чтобы применить изменения.

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *