Создание SSL-сертификата на Apache в Ubuntu 14.04

TLS (или Transport Layer Security, безопасность транспортного уровня) и его предшественник SSL (Secure Socket Layers, уровень защищённых сокетов) – это криптографические протоколы, которые используются для защиты передачи данных в Интернете.

Эти протоколы шифруют трафик между удаленными серверами, предотвращая перехват или несанкционированный доступ к данным. Кроме того, эти протоколы позволяют проверить подлинность домена или сервера посредством сертификата, заверенного надежным центром сертификации (ЦС).

Данное руководство покажет, как создать самоподписанный SSL-сертификат для веб-сервера Apache на Ubuntu 14.04. Самостоятельно подписанный сертификат не сможет подтвердить подлинности сервера, так как он не подписан проверенным ЦС; тем не менее, такой сертификат позволит защитить обмен данными с клиентами.

Требования

Для выполнения данного руководства нужно создать нового пользователя с расширенными привилегиями sudo (root использовать не рекомендуется). Всю необходимую информацию можно найти в статье «Начальная настройка сервера Ubuntu 14.04».

Кроме того, нужно предварительно установить веб-сервер Apache. Для быстрой установки введите:

sudo apt-get update
sudo apt-get install apache2

1: Активация модуля SSL

В Ubuntu 14.04 пакет Apache поддерживает SSL по умолчанию. Нужно просто включить эту функцию.

Чтобы включить модуль, введите:

sudo a2enmod ssl

Включив SSL, перезапустите веб-сервер, чтобы внесенные изменения вступили в силу.

sudo service apache2 restart

Готово! Теперь сервер сможет обрабатывать SSL-запросы после дополнительной настройки (раздел 3).

2: Создание самоподписанного SSL-сертификата

Для начала в конфигурациях Apache нужно создать подкаталог для хранения файлов сертификата:

sudo mkdir /etc/apache2/ssl

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

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

Данная команда содержит следующие опции:

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

Нажмите ENTER, после чего на экране появится ряд вопросов.

Самым важным параметром является Common Name (e.g. server FQDN or YOUR name). В это поле нужно ввести домен, ассоциируемый с сертификатом, или открытый IP-адрес (если такого доменного имени нет).

В целом вопросы имеют примерно следующий вид:

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]:Your Company
Organizational Unit Name (eg, section) []:Department of Kittens
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:your_email@domain.com

Заполните пол соответствующей информацией, после чего ключ и сертификат будут созданы и помещены в каталог /etc/apache2/ssl.

3: Настройка Apache для поддержки SSL

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

Вместо шаблона конфигурации 000-default.conf в подкаталоге sites-available используйте шаблон конфигурационного файла default-ssl.conf, который уже содержит некоторые дефолтные настройки SSL.

Откройте файл с привилегиями root:

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>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

Конфигурации выглядят достаточно сложно; к счастью, большинство опций нужно оставить как есть.

Сначала задайте стандартные параметры виртуального хоста (ServerAdmin, ServerName, ServerAlias, DocumentRoot и т.п.) и укажите местонахождение сертификата и ключа SSL.

После внесения всех изменений файл будет иметь следующий вид (все внесенные в шаблон изменения выделены красным):

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin admin@example.com
ServerName your_domain.com
ServerAlias www.your_domain.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

Сохраните и закройте конфигурационный файл.

4: Активация виртуального хоста SSL

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

sudo a2ensite default-ssl.conf

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

sudo service apache2 restart

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

5: Тестирование

Теперь, когда все готово, нужно только протестировать настройку, открыв домен (или IP-адрес) сервера в браузере, используя следующий формат:

https://домен_или_IP_сервера

На экране появится предупреждение «The site’s security is not trusted!»; это происходит потому, что браузер не может проверить подлинность сервера, к которому нужно подключиться, поскольку сайт не заверен центром сертификации, которому браузер может доверять. Поскольку созданный сертификат является самоподписанным, это ожидаемая реакция.

Как уже говорилось ранее, без подписи ЦС данный сертификат не будет подтверждать подлинность сервера, но позволит защитить обмен данными с удаленными серверами.

Нажмите Proceed anyway (или другую подобную кнопку, предложенную браузером).

Это откроет root-каталог (DocumentRoot), заданный в файле виртуального хоста SSL. Теперь весь трафик будет зашифрован. Чтобы убедиться в этом, нажав на значок замка в меню (в появившемся окне будет выделенный зеленым значок замка с сообщением «connection is encrypted»).

Итоги

Теперь веб-сайт защищен протоколом SSL, что позволит защитить взаимодействие посетителей с сайтом. Тем не менее, каждый посетитель сайта сначала будет видеть на экране предупреждение браузера «The site’s security is not trusted!».

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

Tags: , , , , ,

1 комментарий

Добавить комментарий