Geliştiriciler → Kılavuzlar

DNS-01 ve certbot ile wildcard sertifikalar

DNS-01 doğrulaması, bir alan adını kontrol ettiğinizi bir web sayfası yerine TXT kaydıyla kanıtlar. Wildcard sertifika almanın tek yolu budur ve internetten erişilemeyen sunucularda da çalışır. Bu hook, certbot'un bu kaydı NameOcean API üzerinden yayınlamasını sağlar.

NameOcean, NameOcean DNS kullanan her alan adı için ücretsiz bir wildcard sertifikayı kendisi oluşturur, yeniler ve size bir indirme bağlantısı sunar (SSL veya POST /ssl/example.com). Sunucunuzun kendi sertifikasını alıp yenilemesi gerekiyorsa bu kılavuzu kullanın.

Gerekenler

  • Alan adının DNS'i NameOcean'da olmalıdır (ns1.nameocean.net ile ns4.nameocean.net arası ad sunucuları).
  • Sunucuda certbot, dig (dnsutils veya bind-utils) ve nameocean CLI.
  • dns:read ve dns:write yetkilerine sahip bir API anahtarı. Mümkünse anahtarı sunucunun IP adresiyle sınırlayın.

1. Hook'u kurun

root@server
# 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

Anahtar yalnızca root'un okuyabildiği bir dosyada saklanır; certbot'un kaydettiği yenileme ayarları onu asla içermez.

2. Sertifikayı alın

root@server
# 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, her ad için NameOcean bölgeleriniz arasından ait olduğu bölgeyi bulur, _acme-challenge adlı bir TXT kaydı ekler ve dört ad sunucusunun da bu kayıtla yanıt vermesini bekler; bu genellikle on saniye içinde gerçekleşir. Doğrulamadan sonra temizleme adımı yalnızca eklediği kaydı siler. example.com ve *.example.com ikisi de _acme-challenge.example.com kaydını kullanır; iki değer yan yana yayınlanır.

3. Yenilemeler

certbot hook'ları sertifikayla birlikte saklar, bu nedenle zamanlayıcısı sertifikayı aynı şekilde yeniler. Bunu bir kez test edin:

root@server
# certbot renew --dry-run

Hook'un eklediği ve sildiği her kayıt, işlemi yapan anahtarla birlikte Kontrol Paneli → Etkinlik bölümünde görünür ve dns.record.created ile dns.record.deleted webhook olaylarını gönderir.

Hook

Root olarak çalıştırmadan önce okuyun. Yalnızca nameocean CLI'ı ve dig'i çağırır.

/etc/letsencrypt/nameocean-hook.sh
#!/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

CLI olmadan

Hook, herhangi bir ACME istemcisinden veya dilden yapabileceğiniz iki API çağrısı yapar:

curl
$ 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"