Apache: Установка бесплатного SSL сертификата Let’s Encrypt под Windows Server
\apache-let-encrypt
Если Вы используете web-сервер Apache на операционной системе Windows, то эта краткая инструкция позволит выпустить и установить бесплатный SSL сертификат Let’s Encrypt, настроить автоматический перевыпуск/установку сертификата и перенаправить запросы с http на https.
В зависимости от версий acme и Apache могут быть различия. Тестировалось на Windows 2016 Server, Apache 2.4.58-win64, win-acme 2.2.6.1571.x64. Сертификат “живет” 3 месяца, потом автоматически обновляется.
При выполнении TLS/HTTP проверки ваш сайт должен быть доступен снаружи по полному DNS имени по протоколам HTTP (80/TCP) и HTTPS (443/TCP).
1)Копируем и устанавливаем Apache 2.4 в c:\Apache24 (скачать последние релизы можно от сюда https://www.apachelounge.com/download/)
2)Копируем win-acme в c:\win-acme (скачать можно от сюда https://www.win-acme.com/)
1 |
c:\Apache24\win-acme |
3)Создаем файл C:\win-acme\Scripts\RestartApache.bat с содержимым:
1 |
C:\Apache24\win-acme\Scripts\RestartApache.bat |
1 2 |
net stop "Apache2.4" net start "Apache2.4" |
4)Запускаем клиент win-acme let’s encrypt (c:\win-acme\wacs.exe), я запускал через Far от имени администратора
1 |
c:\Apache24\win-acme\wacs.exe |
5)Выбираем «М»
6)Выбираем «Manual input» (в нашем случае – 2)
7)Вводим имена хостов (в нашем случае mysite.ru)
8)Просит ввести альтернативное имя – просто жмем Enter
9)Выбираем пункт: 4 – Single certificate
10)Выбираем пункт: 1- [http] Save verification files on (network) path
11)Указываем путь:
1 |
c:\Apache24\htdocs |
12)Спрашивает, хотите ли вы скопировать файл web.config перед проверкой, отвечаем “N”
13)Выбираем 2 – «RSA key»
14)Поскольку будем использовать Apache, то выбираем 2 – «PEM encoded files (Apache, nginx, etc.)»
15)Указываем каталог, куда сохраним .pem файлы:
1 |
c:\Apache24\conf |
16)Устанавливать пароль на сертификаты под Apache не нужно
“SSLPassPhraseDialog builtin is not supported on Win32”
под апачем нельзя шифровать сертификаты паролем.
17)Другие варианты нам не нужны, поэтому выбираем 5 – “No (addition) store steps”
18)После создания сертификатов нужно выполнить дополнительный шаг, выбираем пункт 2 – “Start external script or program”
19)Укажем bat-файл (п.4), чтобы автоматически перезапускать сервис Apache после обновления сертификатов:
1 |
c:\Apache24\win-acme\Scripts\RestartApache.bat |
20)Далее вводим:
1 |
{StoreType} {StorePath} {RenewalId} |
21)Больше никаких дополнительных шагов не требуется, выбираем 3 – “No (additional) installation steps”
22)Если ранее вы получали сертификаты на этот адрес (mysite.ru), то потребуется подтвердить свои действия
Надо добавить в конфиг Alias /.well-known “C:/Apache24/htdocs/well-known”
нужно указать логин и пароль пользователя ОС под которым будет запускаться задача в планировщике
23)Сгенерируются ключи (4 файла) в c:\Apache24\conf
1 2 3 4 |
mysite.ru-chain.pem mysite.ru-chain-only.pem mysite.ru-crt.pem mysite.ru-key.pem |
в планировщике появится задача по обновлению сертификатов по окончании срока действия (срок действия сертификата – 3 месяца)
24)Донастраиваем сам Apache – включаем SSL
В файле c:\Apache24\conf\httpd.conf расскомментируем следующие строки:
1 2 3 4 |
Loadmodule ssl_module modules/mod_ssl.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so Include conf/extra/httpd-default.conf Include conf/extra/httpd-ssl.conf |
укажем:
1 2 |
ServerName mysite.ru ServerAdmin admin@mysite.ru |
После рестарта Apache в списке служб будет подобная картинка
Настроим SSL сертификат для всего сервера:
1)для этого отредактируем файл c:\Apache24\conf\extra\httpd-ssl.conf
заменим:
1 2 3 |
SSLCertificateFile "${SRVROOT}/conf/server.crt" на SSLCertificateFile "${SRVROOT}/conf/mysite.ru-chain.pem" |
заменим:
1 2 3 |
SSLCertificateKeyFile "${SRVROOT}/conf/server.key" на SSLCertificateKeyFile "${SRVROOT}/conf/mysite.ru-key.pem" |
заменим:
1 2 3 4 5 |
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES на SSLCipherSuite ECDH+AESGCM256:ECDH+CHACHA20:DH+AESGCM256:ECDH+AES256:DH+AES256:!aNULL:!MD5:!DSS SSLProxyCipherSuite ECDH+AESGCM256:ECDH+CHACHA20:DH+AESGCM256:ECDH+AES256:DH+AES256:!aNULL:!MD5:!DSS |
заменим:
1 2 3 4 5 |
SSLProtocol all -SSLv3 SSLProxyProtocol all -SSLv3 на SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1 |
заменим:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# General setup for the virtual host DocumentRoot "${SRVROOT}/htdocs" ServerName www.example.com:443 ServerAdmin admin@example.com ErrorLog "${SRVROOT}/logs/error.log" TransferLog "${SRVROOT}/logs/access.log" на # General setup for the virtual host DocumentRoot "${SRVROOT}/htdocs" ServerName mysite.ru:443 ServerAdmin <example@example.com> ErrorLog "${SRVROOT}/logs/error.log" TransferLog "${SRVROOT}/logs/access.log" |
2)Перенаправим http на https
В файле c:\Apache24\conf\httpd.conf
Расcкомментируем модуль:
1 |
LoadModule rewrite_module modules/mod_rewrite.so |
После последней строки #LoadModule добавим строки:
1 2 3 |
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} |
В итоге мы получаем SSL соединение и в API, и в браузере.
У кого вылетает такая ошибка:
(WinHttpException): Error 12175 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, ‘Произошла ошибка безопасности’.
ее можно исправить установив КриптоПРО и сопутствующие сертификаты через Контур.Диск:
https://install.kontur.ru
Настроим SSL сертификат для виртуального хоста:
При использовании сертификатов для настройки реального веб-сайта, удобнее создать виртуальный хост с примерно следующими настройками:
1 2 3 4 5 6 7 8 9 |
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:\Apache24\conf переместите туда файлы localhost.key и localhost.crt.
В директории C:\Apache24\conf\ откройте текстовым редактором файл httpd.conf. В самый низ добавьте туда строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
LoadModule ssl_module modules/mod_ssl.so Listen 443 <VirtualHost _default_:443> DocumentRoot "c:/apache24/htdocs/" ServerName localhost:443 ServerAdmin admin@example.com ErrorLog "c:/apache24/logs/error-ssl.log" TransferLog "c:/apache24/logs/access-ssl.log" SSLEngine on SSLCertificateFile "c:/apache24/conf/localhost.crt" SSLCertificateKeyFile "c:/apache24/conf/localhost.key" </VirtualHost> |
заменим:
1 2 |
ServerName localhost:443 ServerAdmin admin@example.com |
заменим:
1 2 3 |
SSLCertificateFile "${SRVROOT}/conf/server.crt" на SSLCertificateFile "c:/apache24/conf/mysite.ru-chain.pem" |
заменим:
1 2 3 |
SSLCertificateKeyFile "${SRVROOT}/conf/server.key" на SSLCertificateKeyFile "c:/apache24/conf/mysite.ru-key.pem" |
Обратите внимание, что вам может понадобиться отредактировать следующие директивы
- DocumentRoot — укажите путь до сайтов на сервере
- ServerName — укажите имя вашего хоста, если это не localhost
Обратите внимание, что мы не просто поместили эти строки в конфигурационный файл, а заключили их в контейнер VirtualHost. Дело в том, что если этого не сделать, то директива SSLEngine on включит SSL для всего веб-сервера, и даже при попытке открыть сайты на 80 порту, эти подключения будут обрабатываться как HTTPS, что вызовет ошибку «Bad Request. Your browser sent a request that this server could not understand». По этой причине эти настройки помещены в контейнер виртуального хоста. Обратите внимание, что используется ключевое слово _default_ – то есть сюда будут собираться все запросы на 443 порт если они не предназначены для другого хоста, который также настроен. То есть при желании вы можете создать больше виртуальных хостов для работы с HTTPS, при этом вместо _default_ указывайте IP хоста или символ * (звёздочка).