- Настройка SSL в Apache с Lets Encrypt
- Настройка SSL Apache с LetsEncrypt
- Шаг 1. Настройка DNS
- Шаг 2. Настройка виртуального хоста
- Шаг 3. Установка клиента Lets Encrypt
- Шаг 4. Получение сертификата
- Шаг 5. Настройка виртуального хоста
- Шаг 6. Дополнительная настройка
- Шаг 6. Редирект
- Шаг 6. Проверка
- Шаг 7. Автопродление сертификата
- Выводы
- ¶ Установка сертификатов удостоверяющих центров в Debian/Ubuntu Linux
- ¶ Установка центра сертификации
- ¶ Установка сертификатов
- ¶ Конвертация сертификата
- ¶ Обновление сертификатов
- ¶ Обновление в Debian/Ubuntu Linux
- ¶ Создание самоподписанного сертификата
- ¶ Создание самоподписанного сертификата с альтернативным доменом
Настройка SSL в Apache с Lets Encrypt
В самом начале развития интернета все данные между сайтом и компьютером пользователя передавались открыто по протоколу HTTP, без шифрования, а это означает, что любой пользователь, находящийся между сервером и компьютером может прочитать эти данные или даже изменить. По такой схеме даже сейчас работает много сайтов. Но в нашем мире это не безопасно, поэтому был разработан протокол HTTPS, который позволяет шифровать данные для передачи между устройствами.
Для шифрования данных в этом протоколе используются сертификаты SSL. Сейчас HTTPS набирает большую популярность, такие компании, как Google и Mozilla пытаются заставить все больше сайтов интернета использовать SSL для защиты данных пользователей. С другой стороны появился сервис Lets Encrypt, который позволяет получить SSL сертификат всем владельцам доменов полностью бесплатно. В этой статье мы рассмотрим как выполняется настройка SSL Apache c Lets Encrypt.
Настройка SSL Apache с LetsEncrypt
Я буду предполагать, что Apache у вас уже установлен и настроен для работы по протоколу http. Если это не так посмотрите статью установка и настройка Apache. Перед тем как переходить к самой настройке веб сервера нам нужно получить ssl сертификат, а для этого нужно установить клиент сервиса в систему.
Шаг 1. Настройка DNS
Наличие DNS — одно из самых важных условий для получения сертификата от Lets Encrypt. Сервис выдаёт сертификаты только публично доступным доменам. Только так они могут убедится, что этот домен принадлежит вам. Поэтому A запись вашего домена должна обязательно указывать на IP адрес, на котором вы собираетесь настроить Apache с SSL. В этом примере я буду рассматривать получение сертификата сразу для домена с www и без www. Поэтому оба домена должны быть привязаны к IP адресу.
Шаг 2. Настройка виртуального хоста
Сайт, для которого вы хотите создать SSL сертификат должен уже быть доступен без HTTPS на порту 80. Поэтому его виртуальный хост Apache должен уже быть настроен. В этом примере я буду получать сертификат для vps.losst.pro. Для примера можно создать такой виртуальный хост:
sudo vi /etc/apache2/sites-available/vps-losst-ru.conf
ServerName vps.losst.pro
ServerAlias www.vps.losst.pro
ServerAdmin webmaster@localhost
DocumentRoot /var/www/vps.losst.pro/public_html
ErrorLog $/error.log
CustomLog $/access.log combined
RewriteEngine on
RewriteCond % =vps.losst.pro [OR]
RewriteCond % =www.vps.losst.pro
RewriteRule ^ https://%% [END,NE,R=permanent]
Далее надо /var/www/vps.losst.pro/public_html не существует, его надо создать и дать на него права пользователю www-data:
sudo mkdir -p /var/www/vps.losst.pro/public_html
chown www-data:www-data /var/www/vps.losst.pro/public_html
Осталось создать HTML файл, который будет открываться при переходу на наш сайт, например:
sudo vi /var/www/vps.losst.pro/public_html/index.html
Далее надо активировать данный сайт в Apache:
И можно убедится, что он работает открыв адрес сайта в браузере.
Шаг 3. Установка клиента Lets Encrypt
Клиент Lets Encrypt называется Certbot. Он доступен в официальных репозиториях. Для установки выполните такие команды:
sudo apt install certbot python-certbot-apache
После этого клиент будет готов к использованию. Если версия из официальных репозиториев вас не устраивает и вам нужна более новая, можно установить версию из snap пакета. Сначала убедитесь, что у вас установлен пакетный менеджер snap или установите его:
Теперь установите самую последнюю версию certbot из snap такой командой:
sudo snap install —classic certbot
После этого клиент можно использовать. В принципе, вы можете использовать любой другой клиент для Lets Encrypt, то официально рекомендуется именно этот.
Шаг 4. Получение сертификата
Далее необходимо получить сертификат. Утилита умеет устанавливать сертификаты автоматически, но мы этого делать не будем, чтобы разобраться как всё делается вручную. Для генерации используется такая команда:
sudo certbot certonly —apache -d vps.losst.pro -d www.vps.losst.pro
Если вы хотите чтобы утилита также автоматически установила полученный сертификат уберите опцию certonly. При первом запуске утилита предложит вам указать ваш Email адрес, для того чтобы отправлять вам уведомления о необходимости обновить сертификат и новости, а также попросит принять лицензионное соглашение:
А потом спросит можно ли передать ваш адрес их партнёрам. Только после этого начнётся генерация сертификата. После завершения, если всё прошло успешно, вы увидите такое сообщение:
Программа сообщает, что сертификат сохранён в папке /etc/letsencrypt/live/vps.losst.pro/ и вы можете его использовать.
Шаг 5. Настройка виртуального хоста
Если вы посмотрите в папку /etc/letsencrypt/live/vps.losst.pro, то увидите там четыре файла:
- cert.pem — файл сертификата, его необходимо прописать в параметре SSLCertificateFile;
- chain.pem — файл цепочки сертификата, обычно прописывается в параметре SSLCertificateChainFile;
- privkey.pem — приватный ключ сертификата, должен быть прописан в SSLCertificateKeyFile;
- fullchain.pem — в нём объединено содержимое cert.pem и chain.pem, можно использовать вместо этих обоих файлов.
Для обычного сайта у нас виртуальный хост существует. Осталось создать виртуальный хост для SSL версии. Тут кроме стандартных настроек надо добавить четіре параметра.
SSLEngine on
SSLCertificateFile /путь/к/сертификату.pem
SSLCertificateChainFile /путь/к/сертификату/цепочки.pem
SSLCertificateKeyFile /путь/к/приватному/ключу.pem
sudo vi /etc/apache2/sites-available/vps-losst-ru-ssl.conf
ServerName vps.losst.pro
ServerAlias www.vps.losst.pro
ServerAdmin webmaster@localhost
DocumentRoot /var/www/vps.losst.pro/public_html
ErrorLog $/error.log
CustomLog $/access.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/vps.losst.pro/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/vps.losst.pro/chain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vps.losst.pro/privkey.pem
Этой конфигурации достаточно чтобы всё заработало. Затем активируйте этот виртуальный хост:
sudo a2ensite vps-losst-ru-ssl
И не забудьте включить модуль для поддержки SSL:
Проверьте работоспособность открыв домен в браузере:
Шаг 6. Дополнительная настройка
Чтобы добавить больше безопасности можно указать какие протоколы SSL следует использовать. Например, для того чтобы отключить SSLv2 и SSLv3, а также TLS ниже 1.2 добавьте:
sudo vi /etc/apache2/sites-available/vps-losst-ru-ssl.conf
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
С помощью параметра SSLCipherSuite можно указать набор шифров, которые стоит использовать:
А чтобы использовались именно эти шифры, а не те, что предложит браузер, следует добавить такую директиву:
После внесения изменений снова парезапустите Apache.
Шаг 6. Редирект
Не забудьте также настроить редирект на HTTPS с HTTP хоста, для этого просто добавьте такие строчки в файл /etc/apache2/sites-available/vps-losst-ru.conf:
RewriteCond % =vps.losst.pro [OR]
RewriteCond % =www.vps.losst.pro
RewriteRule ^ https://%% [END,NE,R=permanent]
Вам надо будет только заменить vps.losst.pro в двух местах на имя вашего домена.
Шаг 6. Проверка
Чтобы проверить как работает SSL и правильно ли выполнена настройка SSL Apache на сайте, вы можете открыть в браузере такую ссылку:
Шаг 7. Автопродление сертификата
Настройка SSL Apache завершена. Но есть один минус, все сертификаты, полученные от Lets Encrypt действительны только на протяжении 90 дней и рекомендуется продлевать и срок действия каждые 60 дней. Клиент Certbot поддерживает команду renew, которая позволяет проверить установленные сертификаты и обновить их если до истечения срока осталось меньше 30 дней.
Чтобы запустить процесс обновления для всех настроенных доменов выполните:
Если сертификат был выдан недавно, то команда проверит его дату истечения и выдаст сообщение, что продление пока не требуется. Если вы создали сертификат для нескольких доменов, то в выводе будет показан только основной домен. Но обновление будет актуально для всех.
Самый простой способ автоматизировать этот процесс — добавить вызов утилиты в планировщик corn. Для этого выполните команду:
Затем, в открывшемся текстовом редакторе добавьте строку и сохраните изменения:
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
Таким образом, мы создали задачу, которая будет выполнять команду обновления каждый понедельник, в 2:30 утра. Информация про результат выполнения будет сохранятся в файл /var/log/le-renewal.log.
Выводы
В этой статье мы рассмотрели как выполняется Настройка SSL Apache, а также установка сертификата Lets Encrypt. Это поможет защитить ваш сайт от MITM атак, подслушивания и модификации трафика, а также благодаря тенденциям поощрения перехода на HTTPS может положительно сказаться на росте трафика из поисковых систем.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
¶ Установка сертификатов удостоверяющих центров в Debian/Ubuntu Linux
Некоторые приложения или сервисы в Linux, на самом деле подавляющее большинство, и в частности веб серверы, такие как NGINX или Apache, устанавливают защищенные SSL шифрованием HTTPS подключения. Установленные в системе сертификаты корневых удостоверяющих центров CA используются этими приложениями для проверки подлинности предоставляемых их клиентами сетификатов.
¶ Установка центра сертификации
Установите пакет корневых сертификатов ca-certificates
apt install -y ca-certificates
¶ Установка сертификатов
Скопируйте заказанный .cer или .crt файл сертификата
cp your_certtificate.crt /usr/local/share/ca-certificates
¶ Конвертация сертификата
Если сертификат получен в формате .pem , то его следует предварительно перевести с .crt формат, используя библиотеку OpenSSL
openssl x509 -outform der -in your_certificate.pem -out your_certificate.crt
После конвертирования можно скопировать файл в нужную папку.
¶ Обновление сертификатов
После этого остается лишь обновить сертификаты и сгенерировать ca-certificates.crt файл, содержащий все установленные в системе сертификаты:
Это обновит файл на основании ссылок из
/etc/ca-certificates.conf
сертификатов из директории
/etc/ssl/certs
и добавит содержимое новых устанавливаемых сертификатов из директории
/usr/local/share/ca-certificates
¶ Обновление в Debian/Ubuntu Linux
В Debian Linux есть визуальный инструмент для обновления сертификатов
dpkg-reconfigure ca-certificates
где можно выбрать устанавливаемые сертификаты или удалить ненужные.
¶ Создание самоподписанного сертификата
Для создания самоподписанного сертификата и загрузки его в секреты Kubernetes:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl/tls.key -out ssl/tls.crt -subj "/CN=halfoff.ru" kubectl create secret tls halfoff-ru-cert --cert=/ssl/tls.crt --key=/ssl/tls.key kubectl create secret tls halfoff-ru-cert --cert=/ssl/tls.crt --key=/ssl/tls.key -n traefik-ingress
¶ Создание самоподписанного сертификата с альтернативным доменом
Создать директорию, сгенерировать ключ сертификат удостоверяющего центра:
mkdir ssl && cd ssl openssl genrsa -des3 -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.pem
Создать файл для добавления альтернативных имен
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = megacorp.ru
Создать самоподписанный сертификат:
openssl genrsa -out selfsigned.key 2048 openssl req -new -key selfsigned.key -out selfsigned.csr openssl x509 -req -in selfsigned.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out selfsigned.crt -days 365 -sha256 -extfile v3.ext