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 и запустить скрипт автоматически задетектит систему и установит все необходимые зависимости.

Можно настроить все в автоматическом режиме, но я предпочитаю все по хардкору, наделать костылей, а потом смотреть как оно все работает.
И так для начала нам нужно завести учетную запись, для этого запустим 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 назад, сегодня только вспомнил, решил дописать.

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

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

    Прямой эфир

    cloudsv 24 октября 2018, 00:27
    О жизни Обновление Scala Rider G4 0
    cloudsv 21 октября 2018, 23:16
    Arch Linux Памятка по основным утилитам Linux 0
    cloudsv 01 июня 2018, 01:39
    Telegram Настройка прокси mtproto для Telegram 26
    cloudsv 22 января 2018, 21:59
    Web Локальное зеркало обновлений Dr.web 0
    cloudsv 03 октября 2017, 10:55
    Web Пароль от резервной копии Bitrix 1
    cloudsv 09 июля 2017, 23:02
    Arch Linux Let's Encrypt это легко и просто 0

    Реклама

    @NormGIF Лучшие гифки интернетов в Telegram, подписывайся