Let's Encrypt это легко и просто

Не так давно chromium, google chrome и прочие браузеры на данном движке стали показывать на сайтах http надпись Не защищено в адресной строке. В этом особо ничего такого нет, но рядовой пользователь может испугаться и покинуть сайт. Сделать сайт "надежным" очень просто, нужно всего лишь установить ssl сертификат, но стоит данная услуга неприлично много, у того же reg.ru на текущий момент 1499 рублей за год по акции, если вы компания, то для вас это копейки, если же у вас сайт или форум по интересам, то нет никакого желания платить за надпись «Надежный» из своего кармана.
Но есть такой проект как let's encrypt, он выдает сертификаты X.509 совершенно бесплатно, единственное, срок действия такого сертификата 3 месяца, но это не страшно, благодаря утилите их можно продливать в автоматическом режиме.

Для начала нам необходима утилита certbot, ее можно раздобыть в репозитории(здесь все подробней расписано, выбираете систему, копипастите команды) или скачать с git'a.
Debian
apt-get install cerbot
CentOS
yum install cerbot
Arch
pacman -S cerbot
Если скачать с git'a и запустить скрипт автоматически задетектит систему и установит все необходимые зависимости.

UPD: 03.01.2022 — Easy way

Берем nginx и делаем такой конфиг /etc/nginx/acme.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/www/lets-encrypt/;
  default_type "text/plain";
  try_files $uri =404;
}
Создаем каталог /var/www/lets-encrypt/
mkdir -p /var/www/lets-encrypt/
chow www-data:www-data /var/www/lets-encrypt/
Инклудим наш acme.conf в конфиг nginx нашего vhost
server {
	listen 80 default_server;
	listen [::]:80 default_server;
	root /var/www/html;
	index index.html index.htm;
	server_name site.ru;
        include acme.conf;
	location / {
		try_files $uri $uri/ =404;
	}
        access_log  /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

}
Поправим конфиг certbot'a /etc/letsencrypt/cli.ini
max-log-backups = 5
authenticator = webroot
webroot-path = /var/www/html
post-hook = nginx -s reload
text = True
Теперь можно выпускать сертификаты
certbot certonly --webroot -d site.ru


После выпуска сертификата добавляем в наш конфиг ssl_certificate и ssl_certificate_key и включаем ssl
server {
	listen 443 ssl http2; 
        ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem;

	root /var/www/html;
	index index.html index.htm;
	server_name site.ru;
        include acme.conf;
	location / {
		try_files $uri $uri/ =404;
	}
        access_log  /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
}
OLD HARD WAY:

Можно настроить все в автоматическом режиме, но я предпочитаю все по хардкору, наделать костылей, а потом смотреть как оно все работает.
И так для начала нам нужно завести учетную запись, для этого запустим certbot с параметрами:
certbot certonly --manual
Он у нас запросит email на который будут приходить оповещения, если у сертификата будет заканчиваться срок действия.
Далее нам нужно принять лицензионное соглашение, ну и выбрать поделиться ли своим email'ом с Electronic Frontier Foundation.
После всего этого можно сразу получить сертификат для нашего домена ну или ввести c и нажать enter для отмены.

В общем предлагаю все это автоматизировать, так как процедуру выполнять надо каждые ~2 месяца, для этого нам понадобится 2 скрипта: auth.sh и clean.sh.

auth.sh — создает файл для проверки валидации домена.
#!/bin/bash
echo $CERTBOT_VALIDATION > /var/www/well-known/$CERTBOT_TOKEN
clean.sh — удаляет файл созданный скриптом
#!/bin/bash
rm -f /var/www/well-known/$CERTBOT_TOKEN
Нужно еще поднастроить apache и создать alias для каталога /var/www/well-known/(если много доменов на сервере, что бы для каждого не создавать данный каталог).
/etc/apaceh2/conf.d/letsencrypt.conf
Alias /.well-known/acme-challenge/ /var/www/well-known/
<Directory "/var/www/well-known/">
        Order allow,deny
        Allow from all
        <IfVersion >= 2.4>
                AllowOverride None
                Require all granted
        </IfVersion>
</Directory>
Ну а теперь самое интересное, команда получения сертификата:
certbot certonly --preferred-challenges=http --manual --manual-auth-hook /root/ssl/auth.sh --manual-cleanup-hook /root/ssl/clean.sh -d DOMAIN_NAME --manual-public-ip-logging-ok
DOMAIN_NAME — имя домена для которого получаем сертификат
/root/ssl/auth.sh и /root/ssl/clean.sh — скрипты описанные выше

Команда обновления сертификатов, добавляется в кронтаб
certbot renew --manual-public-ip-logging-ok --manual-auth-hook /root/ssl/auth.sh --manual-cleanup-hook /root/ssl/clean.sh
В общем то все проще чем кажется.

И небольшой бонус, была у меня задача, генерировать сертификаты для кучи поддоменов, я попросил что бы список выгружали в текстовый файлик, а дальше скриптом я их разбирал бы и генерировал сертификаты, вот выкладываю, вдруг кому пригодится.
getssl.sh
#!/bin/bash
#список доменов для которых нужно сгенерировать и обновлять ssl
dlist="/root/ssl/list"
#Старый список
olist="/root/ssl/old.txt"
#Смотрим домены которые исчезли из списка и переводим все в нижний регистр
deldomain=$(grep -f $dlist -vFx $olist | tr [:upper:] [:lower:])
#Заменяем список старых доменов
cp $dlist /root/ssl/old.txt
#IFS=""
#получаем список наших доменов
for domain in $(cat ${dlist})
do
    #Переводим в нижний регистр
    domain=$(echo $domain | tr [:upper:] [:lower:])
    #получаем список доменов для которых уже есть сертефикаты
    if [ -z $(ls -1  /etc/letsencrypt/live | grep -i -x $domain) ]
    then
	echo "Для домена $domain нет сертефиката"
	certbot certonly --preferred-challenges=http --manual --manual-auth-hook /root/ssl/auth.sh --manual-cleanup-hook /root/ssl/clean.sh -d ${domain} --manual-public-ip-logging-ok
        #генерировать конфиг апача
	echo "<VirtualHost YOUR_IP:443>
        ServerName $domain
        AddDefaultCharset off
        AssignUserID user user
        DocumentRoot /var/www/$domain.com
        ServerAdmin webmaster@$domain.com
        CustomLog /var/www/httpd-logs/$domain.access.log combined
        ErrorLog /var/www/httpd-logs/$domain.error.log
        DirectoryIndex index.html index.php
        SSLCertificateChainFile \"/etc/letsencrypt/live/$domain/chain.pem\"
        SSLCertificateFile \"/etc/letsencrypt/live/$domain/cert.pem\"
        SSLCertificateKeyFile \"/etc/letsencrypt/live/$domain/privkey.pem\"
        SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
        SSLEngine on
        SSLHonorCipherOrder on
        SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
</VirtualHost>" > /etc/apache2/vhosts-default/$domain.conf
        apacher=1
    fi
done

#Удаляем домены которые пропали из списка
for ddomain in $deldomain
do
    echo "Удаляем сертефикат, и конфиг апача домена $ddomain"
    certbot delete --cert-name $ddomain
    rm -f /etc/apache2/vhosts-default/$domain.conf
    apacher=1
done

#Выполняем renew только раз в день
stamp=$(cat /root/ssl/timestamp)
now=$(date +%s)
delta=$(($now-$stamp))
interval=$((60*60*24))
if [ $delta -ge $interval ]
then 
    echo "Иницилизируем процедуру продления сертификатов"
    certbot renew --manual-public-ip-logging-ok --manual-auth-hook /root/ssl/auth.sh --manual-cleanup-hook /root/ssl/clean.sh 
    echo $now > /root/ssl/timestamp
fi

#Если в переменной apacher есть данные, стоит передернуть apache
if [ $apacher ]
then
    echo "Передргиваем apache"
    apachectl graceful
else
    echo "$(date):Никаких обновлений"
fi
Ну вот как то так, вроде все более менее комментированно.

Всем надежных сайтов, статейку начал писать наверное месяца 3 назад, сегодня только вспомнил, решил дописать.

Комментарии ()

  1. seoonly.ru 31 августа 2020, 15:41 # +1
    Спасибо!
    1. cloudsv 31 августа 2020, 15:55 # 0
      блин, можно сделать еще проще, время будет обновлю заметку и добавлю конфиг nginx
      1. Стас 03 января 2022, 10:29 # 0
        Ждем конфиг nginx :)
        1. cloudsv 03 января 2022, 10:50 # 0
          Добавил

    Авторизация

    GitHubGoogleVkontakteYandex
    Есть вопрос или предложение пиши в Telegram @cloudsv

    MTProto прokси для Telegram

    Прямой эфир

    Diego mont 25 мая 2023, 07:04
    Полезные боты в Telegram 2
    cloudsv 24 апреля 2023, 17:56
    Обновление Scala Rider G4 52
    cloudsv 12 ноября 2022, 19:16
    Установка и настройка minidlna 3
    cloudsv 03 ноября 2022, 03:42
    Настройка прокси mtproto для Telegram 52
    cloudsv 03 января 2022, 10:50
    Let's Encrypt это легко и просто 4
    cloudsv 10 сентября 2020, 13:17
    MySQL Workbench падает при подключении 2
    cloudsv 05 августа 2020, 11:57
    Мне вчера стукнуло 34 4
    cloudsv 07 августа 2023, 22:56
    Linux Asus ROG x13 flow 2022 GV301RE и Linux 0
    cloudsv 15 апреля 2023, 16:23
    Linux Уведомление о смены workspace в X11 Linux 0
    cloudsv 17 октября 2020, 09:55
    Linux Отключить DHCP IPv6 в systemd 0
    cloudsv 30 июля 2020, 21:54
    О жизни Мне вчера стукнуло 34 4
    cloudsv 15 апреля 2020, 15:45
    Linux Основные hotkeys редактора Vim 0
    cloudsv 01 октября 2019, 08:00
    Linux Локальный редирект порта в Linux 0
    cloudsv 25 августа 2019, 16:14
    О жизни Социальная сеть от Яндекса Aura 0
    cloudsv 30 июля 2019, 21:34
    О жизни 33 year old 0
    cloudsv 25 июня 2019, 18:29
    Telegram Полезные боты в Telegram 2