Центр сертификации Lets Encrypt

Домашняя страница: Let’s Encrypt is a free, automated, and open Certificate Authority

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

Ограничения. Стоит отметить, что Let’s Encrypt выдает лишь DV-сертификаты, и если вам необходим другой тип сертификата (EV или OV), то следует обращаться к более традиционным провайдерам. DV сертификаты от Let’s Encrypt выдаются на конкретный список доменов и поддоменов (SAN/UCC), т.е. вы не можете получить wildcard-сертификат. Также следует упомянуть, что на данный момент вы можете производить всего до 10 регистраций с одного IP адреса каждые 3 часа, и до 5 сертификатов для одного домена (включая любые поддомены) каждые 7 дней. В будущем эти ограничения могут измениться.

Обратите внимание!

У всех ведущих хостинг провайдеров на виртуальных тарифах настроен автоматический выпуск бесплатных SSL сертификатов Let’s Encrypt.

Читайте руководство далее, если настраивайте сервер VPS/VDS, используя, например мою статью Чек лист по настройке VPS/VDS, выделенного сервера Linux с нуля.

Certbot - это ACME (Automated Certificate Management Environment) - клиент для автоматического создания и установки сертификатов, без остановки web- сервера. Существуют множество других клиентов, кроме certbot , которые поддерживает ACMEv2, например acme.sh.

Настроим поддержку SSL в Apache с настройками HTTPS по умолчанию, для этого нужно включить модуль ssl:

sudo a2enmod ssl
sudo a2ensite default-ssl
sudo systemctl restart apache2

Проверить текущие настройки виртуальных хостов командой apachectl с ключом S. Вы должны увидеть как минимум 2 виртуальных хоста по умолчанию.

# apachectl -S

Ставим пакеты Certbot с поддержкой Apache

sudo apt install certbot python3-certbot-apache

Теперь Certbot установлен на сервере.

Чтобы автоматически получить и настроить SSL для вашего веб-сервера, Certbot должен найти корректный виртуальный хост в ваших файлах конфигурации Apache. Имена доменов ваших серверов будут получены из директив ServerName и ServerAlias, определенных в блоке конфигурации VirtualHost.

Чтобы автоматически получить и настроить SSL для вашего веб-сервера, Certbot должен найти корректный виртуальный хост в ваших файлах конфигурации Apache. Имена доменов ваших серверов будут получены из директив ServerName и ServerAlias, определенных в блоке конфигурации VirtualHost.

Как не странно процедура создания виртуального домена веб сервера Apache всегда вызывает вопросы. Но с другой стороны эта тривиальная задача в интернете описана с гигантским количество ошибок.

Ниже я описываю, как создать виртуальный домен Apache с поддержкой HTTP и HTTPS и установить права на директории.

sudo mkdir /var/www/your_domain
sudo chown -R $USER:$USER /var/www/your_domain

Надеюсь вы не трогали значение umask, тогда выполните команду

sudo chmod -R 755 /var/www/your_domain

Создайте пустой index.html любым известным вам способом, например используя Горячие клавиши текстового редактора Nano.

sudo nano /var/www/your_domain/index.html

Теперь необходимо создать конфигурационный файл виртуального хоста с правильными директивами, не надо менять файл /etc/apache2/sites-available/000-default.conf, нужно создать новый. В в одном и том же файле описываем виртуальных хост для HTTP (порт 80) и HTTPS (порт 443), пути к SSL сертификатам копируем из файла default-ssl.conf. SSL сертификаты нужно указать, в дальнейшем они будут автоматически заменены программой certbot.

sudo nano /etc/apache2/sites-available/your_domain.conf

с таким содержимым

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName your_domain
    ServerAlias www.your_domain
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    ServerAdmin   webmaster@localhost
    DocumentRoot /var/www/your_domain
    ServerName your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Включим созданные виртуальный хост

sudo a2ensite

В выводе это команды вы увидите список всех ваших виртуальных хостов, выделите нужный мышкой и через пробел введите все нужные или сразу укажите нужный хост, набрав команду

sudo a2ensite your_domain.conf

Если нужно, можно отключить хост по умолчанию, но я так не делаю. Для отключения введите команду:

sudo a2dissite 000-default.conf

Обязательно перегружаем Apache, чтобы он подхватил наши изменения

sudo systemctl reload apache2

Введите следующую команду:

sudo certbot --apache

Скрипт certbot предложит вам ответить на ряд вопросов, чтобы настроить сертификат SSL:

  1. Введите действующий адрес электронной почты, которая будет использоваться для уведомлений о продлении и безопасности: жмем Enter.
  2. Подтвердите согласие с условиями обслуживания Let’s Encrypt: ведите А.
  3. Запрос на рассылку писем - нажмите Y (пусть спама в вашей жизни будет больше8-)), можете отказать и выбрать N
  4. Наконец, на этом этапе вас спросят для каких доменов вы хотите получить SSL сертификат. Если хотите активировать HTTPS для всех указанных доменных имен (рекомендуется), то можно оставить командную строку пустой и нажать ENTER, чтобы продолжить. В противном случае выберите домены, для которых вы хотите активировать HTTPS, указав все подходящие номера через запятую и/или пробелы, и нажмите ENTER.
  5. Далее вам будет предложено выбрать, перенаправлять трафик HTTP на HTTPS или нет. На практике это означает, что те, кто посещает ваш веб-сайт через незашифрованные каналы (HTTP), будут автоматически перенаправляться на адрес HTTPS вашего веб-сайта. Выберите 2, чтобы активировать перенаправление, или 1, если хотите сохранить и HTTP, и HTTPS в качестве отдельных методов доступа к вашему веб-сайту.

Поздравляю ваш сайт защищен!

https://certbot.eff.org/#ubuntuxenial-apache

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-apache 

Для получения SSL сертификата выполнить:

sudo certbot --apache

acme.sh альтернатива certbot

На использование acme.sh меня сподвигнул сисадмин Сергей Деревянко. Респект и мое уважение.

Скрипт acme.sh написан на чистом bash, а оригинальный certbot на Python.

Преимущества acme.sh:

  • acme.sh автоматически поддерживает валидацию через DNS, поддерживает много API различных провайдеров, включая Yandex pdd.yandex.ru. Скрипт сам проверяет ваши права на домен добавляя специальную TXT запись в вашу зону (если есть API у вашего провайдера) и генерирует нужные сертификаты.
  • Поддержка docker-а «из коробки», есть уже готовый контейнер от авторов скрипта.
  • Добавляет себя в cron для автоматического обновления сертификатов по таймеру.
  • acme.sh скрипт может выполнить заданную команду после обновления сертификатов — очевидным применением является отправка команды веб-серверу на перезагрузку ключей. Есть ещё хуки для выполнения до и после запуска скрипта.
  • Есть функции для автоматической загрузки ключей в различные хостинговые панели (типа cPanel)

Установка acme.sh

curl https://get.acme.sh | sh

В Использование планировщика cron в Linux на каждой ноде создаем правило:

55 0 * * 6 "/root/.acme.sh"/acme.sh --cron --force --home "/root/.acme.sh" > /dev/null

Настройка Использование планировщика cron в Linux: letsencrypt будет запускаться каждый понедельник 5 часов утра только для обновления устаревших SSL сертификатов.

sudo crontab -e
0 5 * * 1 /usr/bin/letsencrypt renew

или создать файл /etc/cron.d/certboot который будет раз в месяц проверять сертификаты

certboot
@monthly root /usr/bin/letsencrypt renew

Ниже приведены правила для 301 редиректа, которые автоматически генерирует утилита letsencrypt (certbot) после своего запуска. Этот код можно применять и без certbot, в данном примере нужно заменить сайт wiki.dieg.info на ваш. Также добавлен строка отменяющая 301 редирект файла robots.txt. В этой конфигурации файл robots.txt доступен как по протоколу HTTPS так и по протоколу HTTP.

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteCond %{SERVER_NAME} =wiki.dieg.info
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
В интернете много примеров как исключить robots.txt, но большинство из них НЕ работает. Одна из причин, потому что не приводится полный конфигурационный файл. Ниже полный листинг правильного файл перенаправляющего запросы с HTTP на HTTPS и важно! файл .htaccess НЕ используется.

Файл /etc/apache2/sites-enabled/wiki.dieg80.conf

wiki.dieg80.conf
<VirtualHost _default_:80>
        ServerName wiki.dieg.info
        ServerAdmin webmaster@dieg.info
 
        DocumentRoot /var/www/wiki.dieg/wikionline
 
<Directory /var/www/wiki.dieg/wikionline/>
        Options +FollowSymLinks +MultiViews -Indexes
        AllowOverride All
        Order deny,allow
        allow from all
</Directory>
 
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteCond %{SERVER_NAME} =wiki.dieg.info
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
 
</VirtualHost>