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

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


Введение

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

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

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

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

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

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

Предпосылки

Прежде чем приступить к этому руководству, вам потребуется следующее:

  • Access to a Ubuntu 16.04 server with a non-root, sudo-enabled user. Our Initial Server Setup with Ubuntu 16.04 guide can show you how to create this account.

  • You will also need to have Apache installed. You can install Apache using apt. First, update the local package index to reflect the latest upstream changes:

    1. sudo apt update

    Then, install the apache2 package:

    1. sudo apt install apache2

    And finally, if you have a ufw firewall set up, open up the http and https ports:

    1. sudo ufw allow "Apache Full"

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

Шаг 1 — Включение mod_ssl

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

Включите mod_ssl с помощью команды a2enmod:

  1. sudo a2enmod ssl

Перезапустите Apache, чтобы активировать модуль:

  1. sudo systemctl restart apache2

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

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

Теперь, когда Apache готов использовать шифрование, мы можем перейти к созданию нового 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, где разместить сертификат, который мы создаем.

Как мы указывали выше, эти параметры создадут как файл ключа, так и сертификат. Нам будет задано несколько вопросов о нашем сервере, чтобы корректно встроить информацию в сертификат.

Заполните подсказки соответствующим образом. Самая важная строка — та, которая запрашивает 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 []:webmaster@example.com

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

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

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

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

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

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

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

<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 только для целей тестирования:

  1. sudo mkdir /var/www/your_domain_or_ip

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

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

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

<h1>it worked!</h1>

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

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

  1. sudo a2ensite your_domain_or_ip.conf

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

  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 reload apache2

Теперь загрузите свой сайт в браузере, обязательно используя https:// в начале.

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

После этого ваш браузер загрузит сообщение это сработало!.

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

  1. sudo ufw allow "Apache Full"

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

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

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

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

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

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

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

Сохраните и закройте этот файл, когда закончите, затем снова проверьте синтаксис конфигурации и перезагрузите Apache:

  1. sudo apachectl configtest
  2. sudo systemctl reload apache2

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

Заключение

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

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

Для получения дополнительной информации об использовании Let’s Encrypt с Apache, пожалуйста, прочитайте наше руководство Как защитить Apache с помощью Let’s Encrypt в Ubuntu 16.04.