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

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


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

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

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

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

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. Создайте новый фрагмент конфигурации в каталоге snippets nginx:

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, со встроенным брандмауэром, вам также необходимо открыть их из их веб-интерфейса.

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

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

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

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

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

return 301 https://$server_name$request_uri;

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