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

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


Введение

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

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

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

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

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

Предпосылки

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

  • Один сервер Ubuntu 18.04 с пользователем без полномочий root, настроенным с привилегиями sudo и включенным брандмауэром. Вы можете настроить такую учетную запись пользователя, выполнив нашу первоначальную настройку сервера с Ubuntu 18.04
  • Установлен веб-сервер Apache. Если вы хотите установить на свой сервер весь стек LAMP (Linux, Apache, MySQL, PHP), следуйте нашему руководству по настройке LAMP в Ubuntu 18.04. Если вам нужен только веб-сервер Apache, пропустите шаги, относящиеся к PHP и MySQL.

Когда вы выполнили предварительные условия, перейдите к следующему шагу.

Шаг 1 — Создание SSL-сертификата

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

Вы можете создать пару самоподписанного ключа и сертификата с помощью одной команды OpenSSL:

  1. 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: эта подкоманда указывает на использование управления запросом на подпись сертификата (CSR) X.509. «X.509» — это стандарт инфраструктуры открытых ключей, которого придерживаются SSL и TLS для управления ключами и сертификатами. Чтобы создать новый сертификат X.509, используйте эту подкоманду.
  • -x509: это еще больше изменяет предыдущую подкоманду, указывая утилите создать самозаверяющий сертификат вместо создания запроса на подпись сертификата, как это обычно происходит.
  • -nodes: указывает OpenSSL пропустить опцию защиты сертификата с помощью парольной фразы. Apache должен иметь возможность прочитать файл без вмешательства пользователя при запуске сервера. Парольная фраза предотвратит это, поскольку пользователям придется вводить ее после каждого перезапуска.
  • -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.

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

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

Вы сделаете это, внеся несколько изменений в конфигурацию:

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

Когда вы закончите, у вас будет безопасная конфигурация SSL.

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

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

Создайте новый фрагмент в каталоге /etc/apache2/conf-available. В этом примере мы создадим файлы с помощью nano и назовем файл ssl-params.conf, чтобы было понятно его назначение. Не стесняйтесь использовать предпочитаемый вами текстовый редактор:

  1. sudo nano /etc/apache2/conf-available/ssl-params.conf

Чтобы безопасно настроить Apache SSL, мы адаптируем рекомендации от Cipherlist.eu — полезного и удобоваримого ресурса для понимания настроек шифрования, используемых для популярного программного обеспечения.

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

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

Для ваших целей скопируйте предоставленные настройки полностью. Однако вы внесете одно небольшое изменение, отключив заголовок Strict-Transport-Security (HSTS).

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

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

Теперь вставьте конфигурацию в файл ssl-params.conf:


SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes 
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

Сохраните и закройте файл, когда закончите. Если вы используете nano, вы можете сделать это, нажав CTRL + X, затем Y и ENTER.

Изменение файла виртуального хоста Apache SSL по умолчанию

Затем вы измените /etc/apache2/sites-available/default-ssl.conf, файл виртуального хоста Apache SSL по умолчанию. Если вы используете другой файл блока сервера, замените его имя в следующих командах.

Прежде чем начать, создайте резервную копию исходного файла виртуального хоста SSL:

  1. sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

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

  1. sudo nano /etc/apache2/sites-available/default-ssl.conf

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

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

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

После внесения этих изменений ваш блок сервера должен привести к следующему:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

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

(Рекомендуется) Изменение файла хоста HTTP для перенаправления на HTTPS

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

Чтобы настроить незашифрованный файл виртуального хоста для перенаправления всего трафика на шифрование SSL, откройте файл /etc/apache2/sites-available/000-default.conf:

  1. sudo nano /etc/apache2/sites-available/000-default.conf

В блоках конфигурации VirtualHost добавьте директиву Redirect, направляющую весь трафик на SSL-версию сайта:

<VirtualHost *:80>
        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

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

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

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

Просмотрите список доступных профилей, выполнив следующее:

  1. sudo ufw app list

Вывод должен быть следующим:

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

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

  1. sudo ufw status

Если ранее вы разрешили только обычный HTTP-трафик, выходные результаты будут такими:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

Чтобы разрешить дополнительный HTTPS-трафик, вы можете разрешить профиль «Apache Full», а затем удалить избыточный профиль «Apache»:

  1. sudo ufw allow 'Apache Full'
  2. sudo ufw delete allow 'Apache'

Подтвердите изменения, проверив статус:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)

Теперь вы успешно разрешили трафик Apache на ваш брандмауэр.

Шаг 4 — Включение изменений в Apache

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

Включите mod_ssl, модуль Apache SSL и mod_headers, необходимые для некоторых настроек во фрагменте SSL, с помощью команды a2enmod:

  1. sudo a2enmod ssl
  2. sudo a2enmod headers

Затем включите виртуальный хост SSL с помощью команды a2ensite:

  1. sudo a2ensite default-ssl

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

  1. sudo a2enconf ssl-params

На этом этапе ваш сайт и необходимые модули включены. Убедитесь, что в ваших файлах нет синтаксических ошибок с помощью теста:

  1. sudo apache2ctl configtest

Если все прошло успешно, вы получите следующие результаты:

Output
AH00558: 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, чтобы применить ваши изменения:

  1. sudo systemctl restart apache2

Вы внесли свои изменения, и теперь вы будете тестировать свой SSL-сервер.

Шаг 5 — Тестирование шифрования

Теперь пришло время протестировать ваш SSL-сервер. Начните с открытия веб-браузера и введите https://, а затем доменное имя или IP-адрес вашего сервера в адресную строку:

https://server_domain_or_IP

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

Это ожидаемо и нормально. Нас интересует только аспект шифрования нашего сертификата, а не сторонняя проверка подлинности нашего хоста. Нажмите ДОПОЛНИТЕЛЬНО, а затем ссылку, предоставленную для перехода к вашему хосту в любом случае:

Вас должны перенаправить на ваш сайт. В адресной строке браузера у вас будет замок со знаком «x». Это означает, что сертификат не может быть проверен. Он все еще шифрует ваше соединение.

Если вы настроили Apache для перенаправления HTTP на HTTPS, вы также можете проверить, правильно ли работает перенаправление:

http://server_domain_or_IP

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

Шаг 6 — Переход на постоянное перенаправление

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

Снова откройте файл конфигурации блока сервера:

  1. sudo nano /etc/apache2/sites-available/000-default.conf

Найдите строку Redirect, которую вы добавили ранее. Добавьте permanent в эту строку, что изменит переадресацию с временной переадресации 302 на постоянную переадресацию 301:

<VirtualHost *:80>
        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

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

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

  1. sudo apache2ctl configtest

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

  1. sudo systemctl restart apache2

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

Заключение

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