Certbot wildcard-сертификат через API Yandex 360
В случае яндекса установлено время ожидания 4 часа (14400 секунд), так как DNS обновляется довольно долго
Для выпуска используется API Yandex 360.
После получения токена, можно выполнить подготовку скриптов:
config.sh - для задания переменных
# api token for access
declare -A APITOKEN
APITOKEN["domain.com"]='<oauth_токен_yandex_360>'
# orgid - можно посмотреть в админке яндекса в разделе организация
declare -A ORGID
ORGID["domain.com"]='33333333'
# ttl of dns record
declare -A TTLMAP
TTLMAP["domain.com"]=90
# pause after auth hook
declare -A SLEEPMAP
SLEEPMAP["domain.com"]=14400
yandex-auth-hook.sh - для выполнения запросов при проверке владения доменом
#!/bin/bash
_dir="$(dirname "$0")"
source "$_dir/config.sh"
# Strip only the top domain to get the zone id
#DOMAIN=$(expr match "$CERTBOT_DOMAIN" '.*\.\(.*\..*\)')
DOMAIN=$(echo "$CERTBOT_DOMAIN" | awk -F'.' '{print $(NF-1)"."$NF}')
if [ -z "${DOMAIN}" ]; then
echo "CERTBOT_DOMAIN=${CERTBOT_DOMAIN}, DOMAIN=${DOMAIN}, exit"
exit
fi
API_KEY=${APITOKEN["$DOMAIN"]}
if [ -z "${API_KEY}" ]; then
echo "No API_KEY for DOMAIN=${DOMAIN}, exit"
exit
fi
DOMAINTTL=${TTLMAP["$DOMAIN"]}
if [ -z "${DOMAINTTL}" ]; then
echo "No TTL for DOMAIN=${DOMAIN}, exit"
exit
fi
DOMAINSLEEP=${SLEEPMAP["$DOMAIN"]}
if [ -z "${DOMAINSLEEP}" ]; then
echo "No SLEEP for DOMAIN=${DOMAIN}, exit"
exit
fi
ORGID=${ORGID["$DOMAIN"]}
if [ -z "${ORGID}" ]; then
echo "No ORGID for DOMAIN=${DOMAIN}, exit"
exit
fi
#echo $DOMAIN, $API_KEY, $DOMAINTTL, $DOMAINSLEEP, $ORGID
# Create TXT record
RECORD_ID=$(curl -s -X POST "https://api360.yandex.net/directory/v1/org/$ORGID/domains/$DOMAIN/dns" \
-H "Authorization: OAuth $API_KEY" \
-d "{'name':'_acme-challenge','text':'$CERTBOT_VALIDATION','ttl':'$DOMAINTTL','type':'TXT'}" \
| python3 -c "import sys,json;print(json.load(sys.stdin)['recordId'])")
# Save info for cleanup
if [ ! -d /tmp/CERTBOT_$CERTBOT_DOMAIN ];then
mkdir -m 0700 /tmp/CERTBOT_$CERTBOT_DOMAIN
fi
echo $RECORD_ID > /tmp/CERTBOT_${CERTBOT_DOMAIN}/${CERTBOT_VALIDATION}
# Sleep to make sure the change has time to propagate over to DNS
sleep ${DOMAINSLEEP}
yandex-cleanup-hook.sh - для чистки созданных записей txt
#!/bin/bash
_dir="$(dirname "$0")"
source "$_dir/config.sh"
if [ -f /tmp/CERTBOT_${CERTBOT_DOMAIN}/${CERTBOT_VALIDATION} ]; then
RECORD_ID=$(cat /tmp/CERTBOT_${CERTBOT_DOMAIN}/${CERTBOT_VALIDATION})
rm -f /tmp/CERTBOT_${CERTBOT_DOMAIN}/${CERTBOT_VALIDATION}
fi
# DOMAIN=$(expr match "$CERTBOT_DOMAIN" '.*\.\(.*\..*\)')
DOMAIN=$(echo "$CERTBOT_DOMAIN" | awk -F'.' '{print $(NF-1)"."$NF}')
if [ -z "${DOMAIN}" ]; then
echo "CERTBOT_DOMAIN=${CERTBOT_DOMAIN}, DOMAIN=${DOMAIN}, BAD DOMAIN, exit"
exit
fi
API_KEY=${APITOKEN["$DOMAIN"]}
if [ -z "${API_KEY}" ]; then
echo "No API_KEY for DOMAIN=${DOMAIN}, exit"
exit
fi
ORGID=${ORGID["$DOMAIN"]}
if [ -z "${ORGID}" ]; then
echo "No ORGID for DOMAIN=${DOMAIN}, exit"
exit
fi
# Remove the challenge TXT record from the zone
if [ -n "${RECORD_ID}" ]; then
RESULT=$(curl -s -X DELETE "https://api360.yandex.net/directory/v1/org/$ORGID/domains/$DOMAIN/dns/$RECORD_ID" \
-H "Authorization: OAuth $API_KEY")
echo $RESULT
fi
Команда для выпуска сертификата:
certbot certonly --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory \
--manual-auth-hook /scripts/yandex-auth-hook.sh --manual-cleanup-hook /scripts/yandex-cleanup-hook.sh \
-d '*.domain.com'