Создание самоподписанных сертификатов SSL для Apache в Ubuntu 20.04

Введение

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

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

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

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

Чтобы получить более подходящий для производственной среды готовый сертификат, воспользуйтесь бесплатным центром сертификации Let’s Encrypt. Чтобы узнать, как загрузить и настроить сертификат Let’s Encrypt, воспользуйтесь нашим обучающим модулем «Защита Apache с помощью Let’s Encrypt в Ubuntu 20.04».

Предварительные требования

Для прохождения этого обучающего модуля вам потребуется следующее:

  • Доступ к серверу Ubuntu 20.04 с пользователем без прав root с привилегиями sudo. Наше «Руководство по начальной настройке сервера Ubuntu 20.04» рассказывает о том, как создать такого пользователя.
  • Также вам потребуется установить Apache. Вы можете установить Apache с помощью apt. Для начала обновите локальный индекс пакетов, чтобы отразить последние обновления:
  • sudo apt update

Затем установите пакет apache2:

  • sudo apt install apache2

Если вы используете брандмауэр ufw, откройте порты http и https:

  • sudo ufw allow "Apache Full"

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

Шаг 1 — Активация mod_ssl

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

Активируйте mod_ssl с помощью команды a2enmod:

  • sudo a2enmod ssl

Перезапустите Apache для активации модуля:

  • sudo systemctl restart apache2

Теперь модуль mod_ssl активирован и готов к использованию.

Шаг 2 – Создание сертификата SSL

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

Мы можем создать ключ SSL и файлы сертификата с помощью команды openssl:

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

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

  • openssl: это инструмент командной строки, предназначенный для создания сертификатов, ключей и других файлов OpenSSL и управления ими.
  • req -x509: указывает, что мы хотим использовать управление запросами на подписание сертификатов X.509 (CSR). X.509 — это инфраструктура открытых ключей, используемая стандартами SSL и TLS для управления ключами и сертификатами.
  • -nodes: предписывает OpenSSL пропустить опцию защиты нашего сертификата кодовой фразой. Для чтения этого файла при запуске сервера без вмешательства пользователя нам потребуется Apache. Кодовая фраза предотвратит это, поскольку в ином случае нам пришлось бы вводить ее после каждого перезапуска.
  • -days 365: эта опция устанавливает период действия сертификата. Здесь мы устанавливаем срок действия в один год. Многие современные браузеры отклоняют любые сертификаты, срок действия которых превышает один год.
  • -newkey rsa:2048: указывает, что мы хотим сгенерировать новый сертификат и новый ключ одновременно. Мы не создали требуемый ключ для подписи сертификата на предыдущем шаге, и поэтому нам нужно создать его вместе с сертификатом. Часть rsa:2048 предписывает создать ключ RSA длиной 2048 бит.
  • -keyout: эта строка указывает OpenSSL, где разместить генерируемый файл закрытого ключа.
  • -out: указывает OpenSSL, где разместить создаваемый сертификат.

Укажите подходящие ответы. Наиболее важная строка — это та, которая запрашивает Common Name. Вам нужно ввести имя хоста, которое вы будете использовать для доступа к серверу, или публичный IP-адрес сервера. Важно, чтобы значение в этом поле совпадало с вводимыми в адресную строку браузера данными для доступа к сайту, поскольку несоответствие приведет к дополнительным ошибкам безопасности.

Полный список диалогов будет выглядеть примерно так:

Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Example Locality Name (eg, city) [Default City]:Example  Organization Name (eg, company) [Default Company Ltd]:Example Inc Organizational Unit Name (eg, section) []:Example Dept Common Name (eg, your name or your server's hostname) []:your_domain_or_ip Email Address []:[email protected] 

Оба созданных вами файла будут помещены в соответствующие подкаталоги в каталоге /etc/ssl.

Затем мы обновим конфигурацию Apache для использования нового сертификата и ключа.

Шаг 3 — Настройка Apache для использования SSL

Мы подготовили самоподписанный сертификат и ключ, и теперь нам нужно обновить конфигурацию Apache для их использования. В Ubuntu вы можете поместить новые файлы конфигурации Apache (они должны иметь расширение .conf) в каталог /etc/apache2/sites-available/, и они будут загружены при следующей перезагрузке или перезапуске процесса Apache.

Для этого обучающего модуля мы создадим новый файл с минимальной конфигурацией. Если вы уже настроили Apache <Virtualhost>, и вам просто нужно добавить SSL, вы можете просто скопировать строки конфигурации, начинающиеся с SSL, и переключить порт VirtualHost с 80 на 443. Мы займемся портом 80 на следующем шаге.)

Откройте новый файл в каталоге /etc/apache2/sites-available:

  • sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Вставьте в него следующую минимальную конфигурацию VirtualHost:

/etc/apache2/sites-available/your_domain_or_ip.conf

<VirtualHost *:443>    ServerName your_domain_or_ip    DocumentRoot /var/www/your_domain_or_ip     SSLEngine on    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key </VirtualHost>  

Обновите строку ServerName, указав предполагаемое имя для обращения к вашему серверу. Это может быть имя хоста, полное доменное имя или IP-адрес. Убедитесь, что выбранное имя соответствует параметру Common Name, выбранному при создании сертификата.

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

Создадим каталог DocumentRoot и поместим в него файл HTML для целей тестирования:

  • sudo mkdir /var/www/your_domain_or_ip

Откройте новый файл index.html в текстовом редакторе:

  • sudo nano /var/www/your_domain_or_ip/index.html

Вставьте в пустой файл следующее:

/var/www/your_domain_or_ip/index.html

<h1>it worked!</h1> 

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

Сохраните и закройте файл. После этого нам нужно активировать файл конфигурации с помощью инструмента a2ensite:

  • sudo a2ensite your_domain_or_ip.conf

Затем проверим ошибки конфигурации:

  • sudo apache2ctl configtest

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

OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK 

Первая строка — это сообщение о том, что директива ServerName не задана глобально. Если вы хотите избавиться от этого сообщения, вы можете задать для ServerName доменное имя вашего сервера или IP-адрес в каталоге /etc/apache2/apache2.conf. Это необязательно, потому что данное сообщение не наносит никакого вреда.

Если в результатах есть сообщение Syntax OK, в вашей конфигурации нет синтаксических ошибок. Мы можем безопасно перезагрузить Apache для внесения изменений:

  • sudo systemctl reload apache2

Теперь загрузите свой сайт в браузере, добавив префикс https://.

Вы должны увидеть сообщение об ошибке. Для самоподписанных сертификатов это нормально! Браузер предупреждает вас, что не может проверить подлинность сервера, поскольку наш сертификат не подписан известным браузеру центром сертификации. Для целей тестирования и личного использования этого достаточно. У вас должна быть возможность нажать кнопку «Дополнительно» или «Подробности» и продолжить.

После этого браузер загрузит страницу с сообщением it worked!.

Примечание. Если ваш браузер не подключается к серверу, убедитесь, что соединение не блокируется брандмауэром. Если вы используете ufw, следующие команды откроют порты 80 и 443:

  • sudo ufw allow "Apache Full"

Затем мы добавим в нашу конфигурацию другой раздел VirtualHost для обслуживания простых запросов HTTP и их перенаправления в HTTPS.

Шаг 4 — Перенаправление HTTP в HTTPS

Сейчас наша конфигурация отвечает только на запросы HTTPS через порт 443. Также рекомендуется открыть для ответов и порт 80, даже если вы хотите принудительно шифровать весь трафик. Настроим VirtualHost для реагирования на незашифрованные запросы и их перенаправления в HTTPS.

Откройте файл конфигурации Apache, созданный нами на предыдущих шагах:

  • sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Создайте в конце файла еще один блок VirtualHost для запросов через порт 80. Используйте директиву ServerName для привязки вашего доменного имени или IP-адреса. Затем используйте Redirect для перенаправления всех запросов на SSL VirtualHost. Не забудьте добавить косую черту в конце:

/etc/apache2/sites-available/your_domain_or_ip.conf

<VirtualHost *:80>     ServerName your_domain_or_ip     Redirect / https://your_domain_or_ip/ </VirtualHost> 

После завершения правок сохраните и закройте файл, снова протестируйте синтаксис конфигурации и перезагрузите Apache:

  • sudo apachectl configtest
  • sudo systemctl reload apache2

Вы можете протестировать новую функцию переадресации, посетив ваш сайт, введя адрес с префиксом http://. Вы должны быть автоматически перенаправлены на адрес https://.

Заключение

Вы настроили Apache для обслуживания шифрованных запросов с использованием самоподписанного сертификата SSL и перенаправления нешифрованных запросов HTTP на адрес HTTPS.

Если вы планируете использовать SSL для общедоступного сайта, вам следует приобрести доменное имя и использовать широко поддерживаемый центр сертификации, например, Let’s Encrypt.

Дополнительную информацию об использовании Let’s Encrypt с Apache можно получить в обучающем модуле «Защита Apache с помощью Let’s Encrypt в Ubuntu 20.04».