Использование acme в Linux
Пример использования acme.sh
vim genssl.sh
#!/bin/bash
action="$1"
host="$2"
mail="$3"
dir="$4"
folder="$5"
Help()
{
echo "#Установить и сгенерировать сертификат"
echo "genssl -c"
echo "**************************************"
echo "Обновить сертификат"
echo "genssl -u"
echo "**************************************"
echo "Справка по командам"
echo "genssl -h"
echo "**************************************"
}
CheckDir()
{
if [ -d "${1}" ]
then
return 0
else
return 1
fi
}
CheckDomain()
{
regex="^([a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]\.)+[a-zA-Z]{2,}$"
if [[ "$1" =~ $regex ]]
then
return 0
else
return 1
fi
}
CheckMail()
{
regex="^[a-z0-9!#\$%&'*+/=?^_\`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_\`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?\$"
if [[ "$1" =~ $regex ]]
then
return 0
else
return 1
fi
}
#Установить acme.sh
InstallACME()
{
#Создать директории для токенов
mkdir -p "${dir}/.well-known/acme-challenge"
chown -R www-data:www-data "${dir}/.well-known"
#Создать директорию и файл для логов
mkdir -p /var/lib/acme.sh/log
log_file="/var/lib/acme.sh/log/acme.log"
if [ ! -f $log_file ]
then
touch /var/lib/acme.sh/log/acme.log
fi
#install acme.sh
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
#for linux alpine
#apk add acme.sh
if [[ -n "${mail}" ]]
then
#Настройка окружения
./acme.sh --install-online --home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" \
--log "/var/lib/acme.sh/log/acme.log" --cert-home "/var/lib/acme.sh" --server letsencrypt
#Создание аккаунта
./acme.sh --home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" --server letsencrypt --register-account -m "${mail}"
else
echo "Не указан email"
exit 1
fi
cd ../
rm -rf ./acme.sh
#apk del acme.sh
}
#Сгенерировать сертификат LE
AddSsl()
{
if [[ -n "${host}" ]]
then
echo "Сгенерировать сертификат для домена ${host}"
/var/lib/acme.sh/acme.sh --issue --force --debug -d "${host}" --server letsencrypt -w "${dir}" \
--home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" \
--fullchain-file "/etc/nginx/${folder}.crt" --key-file "/etc/nginx/${folder}.key" \
--reloadcmd "nginx -t && rc-service nginx restart"
/var/lib/acme.sh/acme.sh --home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" --install-cronjob
else
echo "Домен не определен"
fi
}
#Обновить сертификат
UpdateSsl()
{
if [[ -n "${host}" ]]
then
echo "Обновить сертификат для домена ${host}"
/var/lib/acme.sh/acme.sh --renew --force --debug -d "${host}" --server letsencrypt -w "${dir}" \
--home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" \
--fullchain-file "/etc/nginx/${folder}.crt" --key-file "/etc/nginx/${folder}.key" \
--reloadcmd "nginx -t && rc-service nginx restart"
/var/lib/acme.sh/acme.sh --home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" --install-cronjob
else
echo "Домен не определен"
fi
}
InsertData()
{
echo "Введите имя домена"
read host_name
echo "Введите путь корневому каталогу сайта"
read root_dir
echo "Введите вашу почту для создания аккаунта"
read mail_user
if CheckDir $root_dir
then
dir=$root_dir
else
echo "Директория ${root_dir} не существует"
exit 1;
fi
if CheckDomain $host_name
then
host=$host_name
else
echo "Неккоректное имя домена ${host_name}"
exit 1;
fi
if CheckMail $mail_user
then
mail=$mail_user
else
echo "Некорректное имя почтового ящика ${mail_user}"
exit 1;
fi
folder=`echo $host | awk -F '.' '{print $1}'`
}
while getopts "cuh" opt
do
case "${opt}" in
c ) InsertData; InstallACME; AddSsl
;;
u ) InsertData; UpdateSsl
;;
h ) Help
;;
* ) Help
;;
esac
done
#Скрипт создает файлы сертификата и ключа в директории /etc/nginx/
#Поэтому необходимо заранее прописать путь к файлам в секции https
#Сертификат не сгенерится и не обновится, если закрыт порт 80 и 443
#После успешной установки будет создан файл с переменными окружения /var/lib/acme.sh/acme.sh.env
#export LE_WORKING_DIR="/var/lib/acme.sh"
#export LE_CONFIG_HOME="/var/lib/acme.sh"
#alias acme.sh="/var/lib/acme.sh/acme.sh --config-home '/var/lib/acme.sh'"
#
#В процессе установки должно быть добавлено задание в крон
#38 0 * * * "/var/lib/acme.sh"/acme.sh --cron --home "/var/lib/acme.sh" --config-home "/var/lib/acme.sh" > /dev/null
#В следующем файле хранится конфигурация для конкрентного домена
#/var/lib/acme.sh/netbash.ru_ecc/netbash.ru.conf
#Например
#Le_NextRenewTimeStr - дата следующего обновления
#Le_RealKeyPath - куда копируется приватный ключ после создания или обновления сертификата домена
#Le_Webroot - корневая директория сайта
#и др.
#В конфигурации nginx для сайта необходимо добавить location, если доступ ограничен
#Пример
location /.well-known/acme-challenge/{
alias /var/www/netbash/.well-known/acme-challenge/;
default_type text/plain;
}
Дополнительные опции
#Справка по командам
#acme.sh -h
#Установить LE в /root/
#acme.sh --upgrade
#Создание учетной записи
#acme.sh --register-account --server letsencrypt -m 89261969132@mail.ru
#Список установленных сертификатов
#acme.sh --list
#Текущая корфигурация acme
#acme.sh --info
#Обновить данные аккаунта
#--update-account
# -m, --email email Specifies the account email, only valid for the '--install' and '--update-account'
# --key-file file Куда будет скопирован приватный ключ в процессе установки
# --fullchain-file file Куда будет скопирован файлы с полной цепочкой сертификата
# --reloadcmd command Команда, которая будет выполнена после генерации или обновления сертификатов
#--install-cronjob добавить задание в крон, которое будет обновлять все сертификаты в домашней директории acme.sh
#--uninstall-cronjob Uninstall the cron job. The 'uninstall' command can do this automatically.
#--account conf file Specifies a customized account config file.
#--home directory Specifies the home dir for acme.sh.
#--cert-home directory Указывает домашнюю директорию для сертификатов, актуально для опции --install
#--config-home directory Указывает на каталог с конфигурацией
Источники
Связанные темы
Конфигурация openvpn сервера в Linux Alpine
Изменить часовой пояс в Linux Alpine
Саздание сертификатов SSL (TLS) для сайта
Настройка openvpn сервера в Linux
Установка сервера Apache Linux Alpine






