TLS или протокол безопасности транспортного уровня и предшествующий ему протокол SSL используются для заключения обычного трафика в защищенную оболочку с шифрованием. Используя эту технологию, серверы могут безопасно отправлять информацию клиентам без перехвата сообщений и их прочтения третьей стороной.
В этом руководстве мы покажем, как создать и использовать самоподписанный сертификат SSL с веб-сервером Apache в Ubuntu 20.04.
Примечание. Самоподписанный сертификат шифрует связь между вашим сервером и любыми клиентами. Однако поскольку он не подписан доверенным центром сертификации, входящим в базовый комплект поставки браузеров и операционных систем, пользователи не могут использовать этот сертификат для автоматической проверки подлинности вашего сервера. В результате этого ваши пользователи увидят ошибку безопасности при посещении вашего сайта.
Из-за этого ограничения самоподписанные сертификаты не подходят для производственной среды, предназначенной для широкой публики. Они обычно используются для тестирования или защиты некритичных сервисов, используемых одиночными пользователями или небольшими группами пользователей, которые могут добавлять сертификат в список доверенных через альтернативные каналы.
Чтобы получить более подходящий для производственной среды готовый сертификат, воспользуйтесь бесплатным центром сертификации Let’s Encrypt. Чтобы узнать, как загрузить и настроить сертификат Let’s Encrypt, воспользуйтесь нашим обучающим модулем «Защита Apache с помощью Let’s Encrypt в Ubuntu 20.04».
Для прохождения этого обучающего модуля вам потребуется следующее:
apt
. Для начала обновите локальный индекс пакетов, чтобы отразить последние обновления:- sudo apt update
Затем установите пакет apache2
:
- sudo apt install apache2
Если вы используете брандмауэр ufw
, откройте порты http
и https
:
- sudo ufw allow "Apache Full"
После выполнения этих шагов убедитесь, что вы вошли в систему в качестве пользователя без прав root, и продолжите работу с этим руководством.
mod_ssl
Прежде чем использовать любые сертификаты SSL, нам необходимо активировать модуль Apache mod_ssl
, который предоставляет поддержку шифрования SSL.
Активируйте mod_ssl
с помощью команды a2enmod
:
- sudo a2enmod ssl
Перезапустите Apache для активации модуля:
- sudo systemctl restart apache2
Теперь модуль mod_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 []:webmaster@example.com
Оба созданных вами файла будут помещены в соответствующие подкаталоги в каталоге /etc/ssl
.
Затем мы обновим конфигурацию Apache для использования нового сертификата и ключа.
Мы подготовили самоподписанный сертификат и ключ, и теперь нам нужно обновить конфигурацию 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:
<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
Вставьте в пустой файл следующее:
<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.
Сейчас наша конфигурация отвечает только на запросы HTTPS через порт 443
. Также рекомендуется открыть для ответов и порт 80
, даже если вы хотите принудительно шифровать весь трафик. Настроим VirtualHost
для реагирования на незашифрованные запросы и их перенаправления в HTTPS.
Откройте файл конфигурации Apache, созданный нами на предыдущих шагах:
- 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:
- 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».
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!