Показать статистику
0 голосов
от (1.7тыс. баллов)
Есть выделенный сервер под управлением Ubuntu 18.04. В качестве веб сервера - nginx. Как подключить сертификат что бы сайт заработал через https?
635 просмотров 1 ответов

1 Ответ

0 голосов
от (17.4тыс. баллов)

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

Что потребуется

Для этого вам понадобится NGINX, работающий на вашем сервере, с готовым подписанным сертификатом. Поскольку у вас уже есть Ubuntu и NGINX, сразу перейдем к процессу создания самоподписанного сертификата (самый дешевый и простой способ - что бы научиться настраивать SSL, настоящий сертификат нам не нужен).

Самоподписанный сертификат

Первым шагом является создание вашего самоподписанного сертификата. Для этого войдите на сервер по SSH (примечание - здесь можно узнать как настроить авторизацию SSH без пароля) и введите следующую команду: 

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

Вам будет задано несколько вопросов (например, название страны, штат, местность и т. Д.). Самый важный вопрос - общее имя (common name). На этот вопрос укажите IP-адрес сервера (либо имя домена на котором будер работать ваш вебсайт, если есть).

После завершения команды необходимые файлы будут добавлены в каталог /etc/ssl

Настройка NGINX

Теперь нам нужно настроить NGINX для использования SSL. Сначала создайте новый файл конфигурации с помощью команды: 

sudo vim /etc/nginx/snippets/self-signed.conf

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

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

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

Затем создайте второй фрагмент конфигурации, который указывает на наш недавно сгенерированный ключ SSL и сертификат. Для этого выполните команду: 

sudo vim /etc/nginx/snippets/ssl-params.conf

Добавьте в этот файл такое содержимое: 

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
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_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
# ssl_stapling on; # Requires nginx >= 1.3.7
# ssl_stapling_verify on; # Requires nginx => 1.3.7
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";

Поскольку мы используем самоподписанный сертификат, мы отключаем опцию "stapling SSL" (метод для быстрого и безопасного определения того, является ли сертификат SSL действительным). Если вы не используете самоподписанный сертификат, удалите символы # перед двумя строками. Вы также можете изменить строку предпочитаемых DNS-серверов (в примере указаны открытые DNS сервера Гугла). Сохраните и закройте этот файл.

Нам также нужно сгенерировать файл dhparam.pem с помощью команды: 

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

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

Следующим шагом будет настройка NGINX с использованием SSL. Предположим, у вас есть серверный блок для example.com. Откройте этот блок сервера с помощью команды: 

sudo vim /etc/nginx/sites-available/example.com

Отредактируйте этот файл и добавьте такие строки: 

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

    server_name example.com www.example.com;

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

}

Ниже добавьте другой блок конфига (для перенаправления HTTP -> HTTPS, т.е. что бы сайт был доступен ТОЛЬКО по SSL): 

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

    server_name example.com www.example.com;

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

И напоследок нужно слинковать файлы sites-available с sites-enabled

ln -s /etc/nginx/sites-available/www.example.com /etc/nginx/sites-enabled/

Пара слов про символические ссылки здесь (для тех кто интересуется).

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

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

Убедимся что все работает

Используя ufw, мы можем поддержку SSL с помощью команды: 

sudo ufw app list

Из вывода этой команды должно быть видно что NGINX имеет поддержку HTTPS. Примерно это выглядит так: 

Available applications:
  Dovecot IMAP
  Dovecot POP3
  Dovecot Secure IMAP
  Dovecot Secure POP3
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
  Postfix
  Postfix SMTPS
  Postfix Submission

Теперь осталось перезагрузить NGINX: 

sudo systemctl restart nginx

Теперь вы сможете указать браузеру https://SERVER_IP (где SERVER_IP - это IP-адрес вашего сервера) и увидеть предупреждение о безопасности сертификата (т.к.  мы используем самоподписанный сертификат).

Это ожидаемо и вполне нормально. Нас интересует только аспект шифрования нашего сертификата, а не проверка третьей стороной подлинности хоста. Нажмите «ADVANCED», а затем предоставленную ссылку, чтобы в перейти к вашему хосту:

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

...