Не так давно
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 назад, сегодня только вспомнил, решил дописать.
Комментарии ()