Ай Лайн
Связаться
Отдел продаж +7 (812) 385-74-84
Время работы пн-пт с 9:00 до 18:00

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'
Оставить заявку