Apache SSL: переход Apache на HTTPS
Нужен ли HTTPS?
Протокол HTTPS позволяет передавать данные между сайтом и пользователем в зашифрованном виде, то есть посторонние лица не могут увидеть содержимое передаваемых данных и изменить их.
Веб-сервер Apache поддерживает работу HTTPS. Для настройки HTTPS на Apache нужен SSL сертификат. Точнее говоря, «SSL сертификат» включает в себя приватный ключ и публичный ключ (сертификат). Также вместе с SSL ключами дополнительно могут присылаться сертификаты центра сертификации, корневой сертификат.
Сертификаты SSL
SSL сертификаты можно разделить на два вида: валидные и самоподписанные.
Сертификат SSL можно сгенерировать у себя на компьютере. Причём можно сгенерировать для любого доменного имени. Но к таким сертификатам у веб-браузеров нет доверия. Поэтому если открыть сайт, защищённый таким сертификатом, то веб-браузер напишет ошибку, что сертификат получен из ненадёжного источника и либо запретит открывать этот сайт, либо предложит перейти на сайт на ваш страх и риск. Это так называемые «самоподписанные сертификаты». Чтобы браузер не выдавал ошибку о ненадёжного сертификате, его нужно добавить в список доверенных. Такие сертификаты подойдут для тестирования веб-сервера и обучению настройки веб-сервера для работы с SSL и HTTPS. Ещё такой сертификат можно использовать на сайте, к которому имеет доступ ограниченный круг лиц (несколько человек) — например, для сайтов в локальной сети. В этом случае они все могут добавить сертификат в доверенные.
Для реального сайта такой сертификат не подойдёт.
Для рабочего окружения нужен валидный сертификат, его можно получить двумя способами:
1) получить тестовый сертификат на 3 месяца (затем его можно продлить)
2) купить сертификат — в этом случае он действует от года и более
Валидный сертификат отличается от самоподписанного тем, что сторонний сервис удостоверяет подлинность этого сертификата. Собственно, оплачивается именно эта услуга удостоверения, а не выдача сертификата.
Данная статья посвящена вопросу, как настроить Apache в Windows для работы с протоколом HTTPS, будет показано, как подключить SSL сертификаты к Apache в Windows. Поэтому для целей тестирования и обучения нам хватит самоподписанного сертификата.
Как сгенерировать SSL сертификат в Windows
У меня веб-сервер установлен в папку C:\Server\bin\Apache24, поэтому если у вас он в другой директории, то подправьте команды под свои условия.
Откройте командную строку Windows (Win+x, далее выберите «Windows PowerShell (администратор)»). В командной строке введите команды:
1 2 3 4 5 |
cmd cd C:\Server\bin\Apache24\bin\ set OPENSSL_CONF=C:\Server\bin\Apache24\conf\openssl.cnf openssl.exe genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out localhost.key openssl.exe req -new -key localhost.key -out localhost.csr |
При вводе последней команды появятся запросы на английском языке. Ниже следует их перевод.
1 2 3 4 5 6 7 |
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- |
Перевод:
Вас попросят ввести информацию, которая будет включена в запрос вашего сертификата. То, что вы будете вводить, называется Distinguished Name или DN. Там всего несколько полей, которые можно оставить пустыми. В некоторых полях будут значения по умолчанию. Если вы введёте ‘.’, то поле будет оставлено пустым.
Далее:
1 |
Country Name (2 letter code) [AU]: |
Перевод:
Двухбуквенное имя страны (двухбуквенный код)
Далее:
1 |
State or Province Name (full name) [Some-State]: |
Перевод:
Название штата или провинции/области (полное имя)
Далее:
1 |
Locality Name (eg, city) []: |
Перевод:
Название населённого пункта (например, города)
Далее:
1 |
Organization Name (eg, company) [Internet Widgits Pty Ltd]: |
Перевод:
Название организации (т.е. компании).
Далее:
1 |
Organizational Unit Name (eg, section) []: |
Перевод:
Подразделение организации (т.е. отдел)
Далее:
1 |
Common Name (e.g. server FQDN or YOUR name) []: |
Перевод:
Общее имя (например, FQDN сервера или ВАШЕ имя). Это самая важная часть — здесь нужно ввести доменное имя. Можете ввести localhost.
Далее:
1 |
Email Address []: |
Перевод:
Адрес электронной почты
Далее:
1 2 3 4 |
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: |
Перевод:
1 2 3 |
Пожалуйста, введите следующие «дополнительные» атрибуты для отправки с вашим запросом сертификата Пароль запроса: Опциональное имя компании: |
Теперь выполните команду:
1 |
openssl.exe x509 -req -days 365 -in localhost.csr -signkey localhost.key -out localhost.crt |
В результате в каталоге C:\Server\bin\Apache24\bin\ должны появиться три новых файла:
- localhost.key
- localhost.csr
- localhost.crt
Из них нам понадобятся только два:
- localhost.key
- localhost.crt
Как в Windows для Apache подключить SSL сертификаты
При использовании сертификатов для настройки реального веб-сайта, удобнее создать виртуальный хост с примерно следующими настройками:
1 2 3 4 5 6 7 8 |
LoadModule ssl_module modules/mod_ssl.so Listen 443 <VirtualHost *:443> ServerName www.example.com SSLEngine on SSLCertificateFile "/путь/до/www.example.com.crt" SSLCertificateKeyFile "/путь/до/www.example.com.key" </VirtualHost> |
Для настройки использования SSL на локальном веб-сервере Apache в Windows следуйте инструкции ниже.
В каталоге C:\Server\ создайте новую папку certs и переместите туда файлы localhost.key и localhost.crt.
В директории C:\Server\bin\Apache24\conf\ откройте текстовым редактором файл httpd.conf. В самый низ добавьте туда строки:
1 2 3 4 5 6 7 8 9 10 11 12 |
LoadModule ssl_module modules/mod_ssl.so Listen 443 <VirtualHost _default_:443> DocumentRoot "c:/Server/data/htdocs/" ServerName localhost:443 ServerAdmin admin@example.com ErrorLog "${SRVROOT}/logs/error-ssl.log" TransferLog "${SRVROOT}/logs/access-ssl.log" SSLEngine on SSLCertificateFile "C:\Server\certs\localhost.crt" SSLCertificateKeyFile "C:\Server\certs\localhost.key" </VirtualHost> |
Обратите внимание, что вам может понадобиться отредактировать следующие директивы
- DocumentRoot — укажите путь до сайтов на сервере
- ServerName — укажите имя вашего хоста, если то не локалхост
Обратите внимание, что мы не просто поместили эти строки в конфигурационный файл, а заключили их в контейнер VirtualHost. Дело в том, что если этого не сделать, то директива SSLEngine on включит SSL для всего веб-сервера, и даже при попытке открыть сайты на 80 порту, эти подключения будут обрабатываться как HTTPS, что вызовет ошибку «Bad Request. Your browser sent a request that this server could not understand». По этой причине эти настройки помещены в контейнер виртуального хоста. Обратите внимание, что используется ключевое слово _default_ – то есть сюда будут собираться все запросы на 443 порт если они не предназначены для другого хоста, который также настроен. То есть при желании вы можете создать больше виртуальных хостов для работы с HTTPS, при этом вместо _default_ указывайте IP хоста или символ * (звёздочка).
После этого сохраните изменения, закройте файл и перезапустите веб-сервер.
1 |
c:\Server\bin\Apache24\bin\httpd.exe -k restart |
Для проверки сделанных изменений, перейдите по адресу https://localhost/ (протокол HTTPS). Поскольку сертификат является самоподписанным, то появится такое сообщение:
К самоподписанным сертификатам нет доверия и эту ошибку нельзя убрать без добавления таких сертификатов в доверенные. Для перехода нажмите «Всё равно продолжить».
Как уже было сказано, валидные сертификаты нужно покупать, либо использовать тестовые. В чём подвох использования тестовых сертификатов? Формально, в какой-то момент их могут перестать выдавать, но, на самом деле, уже сейчас многие сайты годами живут с такими тестовыми сертификатами. На современных хостингах настроено автоматическое подключение и продление таких сертификатов — это просто супер удобно. Обычно на хостингах предусмотрено некоторое количество абсолютно бесплатных SSL сертификатов с автоматическим продлением, но за небольшую плату (10 рублей в месяц), можно подключить тестовые сертификаты для любого количества сайтов.
Решение проблем
При некоторых условиях может возникнуть следующая ошибка:
1 2 3 4 5 6 |
Can't open C:\Program Files\Common Files\SSL/openssl.cnf for reading, No such file or directory 9112:error:02001003:system library:fopen:No such process:crypto\bio\bss_file.c:72:fopen('C:\Program Files\Common Files\SSL/openssl.cnf','r') 9112:error:2006D080:BIO routines:BIO_new_file:no such file:crypto\bio\bss_file.c:79: unable to find 'distinguished_name' in config problems making Certificate Request 9112:error:0E06D06A:configuration file routines:NCONF_get_string:no conf or environment variable:crypto\conf\conf_lib.c:270: |
Главная подсказка в первой строке: Can’t open C:\Program Files\Common Files\SSL/openssl.cnf for reading, No such file or directory — она означает, что возникла ошибка чтения файла C:\Program Files\Common Files\SSL/openssl.cnf из-за того, что он отсутствует.
Файл openssl.cnf поставляется с самим веб-сервером Apache и находится в папке conf. Поэтому есть несколько вариантов, как исправить эту ошибку. Например, можно создать нужные папки и скопировать туда этот файл. Но можно пойти более простым путём — на время создания сертификатов установить переменную окружения OPENSSL_CONF указав в ней правильный путь до файла.
Также нужно переключиться из PowerShell в обычную командную строку Windows, поскольку иначе переменная окружения почему-то не устанавливается. Допустим, сервер размещён в папке C:\Server\bin\Apache24\bin\, тогда файл openssl.cnf расположен по пути C:\Server\bin\Apache24\conf\openssl.cnf, в этом случае, чтобы исправить ошибку Can’t open C:\Program Files\Common Files\SSL/openssl.cnf for reading, No such file or directory нужно выполнить:
1 2 3 |
cmd cd C:\Server\bin\Apache24\bin\ set OPENSSL_CONF=C:\Server\bin\Apache24\conf\openssl.cnf |
Отредактируйте пути в этих командах в соответствии с вашей структурой папок.