DNS-01 tekshiruvi domenni boshqarishingizni veb-sahifa o'rniga TXT yozuvi orqali isbotlaydi. Bu wildcard sertifikat olishning yagona usuli bo'lib, internetdan kirib bo'lmaydigan serverlar uchun ham ishlaydi. Ushbu hook certbot'ga bu yozuvni NameOcean API orqali e'lon qilish imkonini beradi.
POST /ssl/example.com). Serveringiz sertifikatni o'zi olishi va yangilashi kerak bo'lsa, ushbu qo'llanmadan foydalaning.dns:read va dns:write ruxsatlariga ega API kaliti. Iloji bo'lsa, uni serverning IP manzili bilan cheklang.# curl -fsSL https://nameocean.net/install.sh | sh # curl -fsSL https://nameocean.net/developers/guides/letsencrypt-dns-01/nameocean-hook.sh \ -o /etc/letsencrypt/nameocean-hook.sh # chmod 700 /etc/letsencrypt/nameocean-hook.sh # echo 'NAMEOCEAN_API_KEY=no_live_…' > /etc/letsencrypt/nameocean.env # chmod 600 /etc/letsencrypt/nameocean.env
Kalit faqat root o'qiy oladigan faylda saqlanadi; certbot saqlaydigan yangilash sozlamalarida u hech qachon bo'lmaydi.
# certbot certonly --manual --preferred-challenges dns \
--manual-auth-hook "/etc/letsencrypt/nameocean-hook.sh auth" \
--manual-cleanup-hook "/etc/letsencrypt/nameocean-hook.sh cleanup" \
-d example.com -d "*.example.com"
Hook har bir nom uchun u tegishli bo'lgan zonani NameOcean zonalaringiz orasidan topadi, _acme-challenge ni TXT yozuvi sifatida qo'shadi va to'rtala nameserver ham uni qaytarguncha kutadi, odatda o'n soniya ichida. Tekshiruvdan so'ng tozalash bosqichi aynan o'zi qo'shgan yozuvni o'chiradi. example.com va *.example.com ikkalasi ham _acme-challenge.example.com dan foydalanadi; ikkala qiymat yonma-yon e'lon qilinadi.
certbot hook'larni sertifikat bilan birga saqlaydi, shuning uchun uning taymeri sertifikatni xuddi shu usulda yangilaydi. Buni bir marta sinab ko'ring:
# certbot renew --dry-run
Hook qo'shgan va o'chirgan har bir yozuv buni bajargan kalit bilan birga Boshqaruv paneli → Faoliyat bo'limida ko'rinadi hamda dns.record.created va dns.record.deleted webhook hodisalarini yuboradi.
Uni root sifatida ishga tushirishdan oldin o'qib chiqing. U faqat nameocean CLI va dig'ni chaqiradi.
#!/bin/sh
# certbot DNS-01 hooks for NameOcean DNS:
# --manual-auth-hook "/etc/letsencrypt/nameocean-hook.sh auth"
# --manual-cleanup-hook "/etc/letsencrypt/nameocean-hook.sh cleanup"
# Needs the nameocean CLI and an API key with dns:write, in /etc/letsencrypt/nameocean.env:
# NAMEOCEAN_API_KEY=no_live_...
set -e
[ -f /etc/letsencrypt/nameocean.env ] && . /etc/letsencrypt/nameocean.env && export NAMEOCEAN_API_KEY
# the zone CERTBOT_DOMAIN is in: the longest of your zones it ends with
zone="$NAMEOCEAN_ZONE"
if [ -z "$zone" ]; then
for z in $(nameocean dns ls --json | sed -n 's/.*"name": *"\([^"]*\)".*/\1/p'); do
case "$CERTBOT_DOMAIN" in "$z" | *".$z") [ ${#z} -gt ${#zone} ] && zone="$z" ;; esac
done
fi
[ -n "$zone" ] || { echo "no NameOcean DNS zone for $CERTBOT_DOMAIN" >&2; exit 1; }
name="_acme-challenge"
[ "$CERTBOT_DOMAIN" = "$zone" ] || name="_acme-challenge.${CERTBOT_DOMAIN%.$zone}"
case "$1" in
auth)
id=$(nameocean dns add "$zone" TXT "$name" "$CERTBOT_VALIDATION" --ttl 5m --json \
| sed -n 's/.*"id": *\([0-9][0-9]*\).*/\1/p' | head -n 1)
[ -n "$id" ] || { echo "could not add the TXT record" >&2; exit 1; }
echo "$id" # certbot passes this to the cleanup hook as CERTBOT_AUTH_OUTPUT
# wait until all four nameservers answer with it (usually a few seconds)
for i in $(seq 1 60); do
n=0
for ns in ns1 ns2 ns3 ns4; do
dig +short TXT "$name.$zone" "@$ns.nameocean.net" | grep -q -- "$CERTBOT_VALIDATION" && n=$((n + 1))
done
[ "$n" -eq 4 ] && exit 0
sleep 2
done
echo "the TXT record is not on every nameserver after 2 minutes" >&2
exit 1
;;
cleanup)
[ -z "$CERTBOT_AUTH_OUTPUT" ] || nameocean dns rm "$zone" TXT "$CERTBOT_AUTH_OUTPUT"
;;
*)
echo "usage: $0 auth|cleanup" >&2
exit 2
;;
esac
Hook ikkita API so'rovini yuboradi, ularni istalgan ACME mijozi yoki dasturlash tilidan yuborishingiz mumkin:
$ curl -X POST https://nameocean.net/api/v1/dns/example.com/records \ -H "Authorization: Bearer $NAMEOCEAN_API_KEY" -H "Content-Type: application/json" \ -d '{"type": "TXT", "hostname": "_acme-challenge", "text": "<validation>", "ttl": "5m"}' {"id": 4190, "type": "TXT", "hostname": "_acme-challenge", …} $ curl -X DELETE https://nameocean.net/api/v1/dns/example.com/records/TXT/4190 \ -H "Authorization: Bearer $NAMEOCEAN_API_KEY"