Настройка HTTPS для Apache 2.4 под Windows
Два слова о протоколе HTTPS
HTTPS — это протокол обмена данными, который полностью описывается фразой "HTTP поверх SSL/TLS". Когда пользователь набирает в браузере адрес сайта, например, "https://www.site.com/info.html", происходит следующее:
- Веб-браузер посредством DNS-запроса определяет IP-адреса сервера "www.site.com". Если не используется технология DNSCrypt, этот запрос происходит в открытом виде, без шифрования.
- Между веб-браузером и веб-сервером устанавливается защищённый канал передачи данных SSL/TLS.
- По защищённому каналу осуществляется обмен между веб-браузером и веб-сервером по протоколу HTTP.
При установке HTTPS-соединения веб-браузеры проверяют подлинность сервера с использованием сертификата, выданного ему удостоверяющим центром. Сертификат — это подписанные секретным ключом удостоверяющего центра открытый ключ веб-сервера и информация о сервере. Если сертификат недействителен или данные, указанные в сертификате, не совпадают с реквизитами сервера, пользователю будет выдано предупреждение с рекомендацией отказаться от работы с этим сервером.
Чтобы с веб-сервером Apache можно было взаимодействовать по протоколу HTTPS, понадобится:
- Сгенерировать криптографические ключи веб-сервера.
- Получить сертификат веб-сервера.
- Настроить веб-сервер на работу по протоколу HTTPS.
В дальнейшем изложении предполагается, что установка и настройка веб-сервера выполнена в соответствии с рекомендациями, изложенными в статье "Параметрическая настройка Apache 2.4 под Windows".
Генерация криптографических ключей
Для генерации криптографических ключей понадобится ввести ряд команд в окне командной строки. Прежде всего, для хранения криптографических файлов создадим папку "D:\www\conf\ssl" и сделаем её текущей:
D:
MD \www\conf\ssl
CD \www\conf\ssl
Механизмы криптографии в поставке Apache от Apache Lounge реализованы с помощью пакета OpenSSL, который представлен программой "Apache24\bin\openssl.exe". Чтобы не набирать постоянно полный путь к ней, добавим папку с двоичными файлами веб-сервера в переменную среды окружения PATH:
PATH %PATH%;"%ProgramFiles%\Apache24\bin"
Для генерации секретного ключа сервера нужно в консоли OpenSSL ввести команду:
openssl.exe genrsa -out server.key 2048
В этой команде "server.key" — это имя файла, в который будет записан секретный ключ, а "2048" — длина ключа в битах. Файл "server.key" содержит конфиденциальную информацию, поэтому нужно принять меры по его защите, чтобы предотвратить компрометацию сервера.
Открытый ключ сервера может быть извлечён из секретного ключа и выгружен в файл "server.pub" командой:
openssl.exe rsa -in server.key -pubout > server.pub
Однако для настройки HTTPS-сервера в явном виде открытый ключ нигде не требуется.
Получение сертификата
Чтобы получить сертификат веб-сервера, нужно на основе криптографических ключей составить запрос в удостоверяющий центр на выдачу сертификата. Формирование запроса производится командой:
openssl.exe req -new -key server.key -out server.csr -config ../openssl.cnf
В параметре "-config" указан путь к файлу конфигурации OpenSSL, который находится в папке "conf" поставляемого пакета с веб-сервером.
Для генерации запроса нужно набрать с клавиатуры ответы на задаваемые вопросы о принадлежности и реквизитах сервера. На этом этапе важно иметь в виду, что для ввода в поле данных пустого значения нужно ввести " . " (точку). Если вместо этого просто нажать клавишу [Enter], то будет принято значение по умолчанию, которое указано в квадратных скобках. А сами данные следующие:
- County name
- — двухзначный буквенный код страны;
- State or Province Name
- — название региона, области, района;
- Locality Name
- — название населённого пункта;
- Organization Name
- — название организации;
- Organizational Unit Name
- — название подразделения;
- Common Name
- — доменное имя сервера;
- Email Address
- — контактный адрес электронной почты;
- A challenge password
- — кодовое слово;
- An optional company name
- — дополнительное название организации;
Значения последних двух полей вводить не обязательно. Самое главное — правильно указать доменное имя сервера, потому что именно по этому реквизиру веб-браузеры будут проверять подлинность веб-сервера.
В результате выполнения этой команды будет сформирован файл "server.csr", содержащий необходимую для выдачи сертификата информацию. Этот файл можно отправлять в удостоверяющий центр, после чего ожидать от него ответа.
Но для локального тестирования сайта или внутреннего использования в корпоративной интрасети можно подписать сертификат секретным ключом самого веб-сервера, а не удостоверяющего центра, получив так называемый "самоподписанный" сертификат. Делается это с помощью команды:
openssl.exe x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Сертификат сроком на 365 дней, подписанный секретным ключом сервера "server.key" в ответ на запрос "server.csr", помещается в файл "server.crt".
Настройка веб-сервера
В результате выполнения описанных выше действий в папке "D:\www\conf\ssl" имеются необходимые для работы протокола HTTPS файлы:
- server.key
- — секретный ключ веб-сервера;
- server.crt
- — сертификат веб-сервера.
За обслуживание протокола SSL/TLS отвечает модуль "mod_ssl", который вместе с модулем кеширования и соответствующим файлом настроек нужно подключить к веб-серверу с помощью следующих изменений главного конфигурационного файла "D:\www\conf\httpd.conf":
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule ssl_module modules/mod_ssl.so
LoadModule ssl_module modules/mod_ssl.so
#Include conf/extra/httpd-ssl.conf
Include ${DOCROOT}/conf/extra/httpd-ssl.conf
Если веб-сервер установлен в соответствии с описанной ранее методикой, то в конфигурационном файле "D:\www\conf\extra\httpd-ssl.conf" нужно все вхождения "${SRVROOT}" заменить на "${DOCROOT}". Кроме того, нужно в этом же файле исправить пути к секретному ключу и сертификату веб-сервера:
#SSLCertificateFile "${DOCROOT}/conf/server.crt"
SSLCertificateFile "${DOCROOT}/conf/ssl/server.crt"
#SSLCertificateKeyFile "${DOCROOT}/conf/server.key"
SSLCertificateKeyFile "${DOCROOT}/conf/ssl/server.key"
В том же файле нужно указать правильные имя сервера и контактный адрес электронной почты. Эти реквизиты должны совпадать с теми, которые были введены при формировании запроса на сертификат. Например, для локального сервера доменное имя будет "localhost", а адрес электронной почты — "webmaster@localhost":
#ServerName www.example.com:443
ServerName localhost:443
#ServerAdmin admin@example.com
ServerAdmin webmaster@localhost
Если после выполненных настроек в адресной строке браузера набрать "https://localhost/", то при использовании самоподписанного сертификата отобразится строгое предупреждение:

Рис. Отключение системы защиты веб-браузера от доступа к сайтам с недостоверными сертификатами.
Для "обхода" защиты нужно последовательно нажать кнопки "Подробности" и "Сделать исключение для данного сайта", после чего на экране отобразится страница, полученная с сервера по протоколу HTTPS.
В решении проблем, возникающих при настройке доступа к серверу по протоколу HTTPS, может помочь команда, устанавливающая защищённое протоколом SSL/TLS соединение с веб-сервером:
openssl.exe s_client -connect localhost:443 -state -debug
При её выполнении на экран будут выведены сведения о процедуре согласования параметров безопасного канала передачи данных и этапах его установления. Если канал будет успешно установлен, то можно вводить консольные команды по протоколу HTTP. Например, для получения главной страницы сайта нужно набрать:
GET / HTTP/1.0
Ввод команды нужно завершить двумя нажатиями клавиши [Enter]. В ответ на экран будут выведены:
- отправленные на сервер зашифрованные данные;
- зашифрованные данные, полученные от сервера;
- расшифрованный ответ сервера.
Литература:
Ivan Risticz. Apache Security, 2005.