DNSSEC Reference
DNSSEC lifecycle and key management endpoints. For concepts, see DNSSEC. For a step-by-step guide, see Enabling DNSSEC.
Base path: /api/v1/domains/{domain_id}/dnssec
Required permission: dnssec:read, dnssec:enable, dnssec:disable, dnssec:rotate
GET /api/v1/domains/{domain_id}/dnssec#
Get the current DNSSEC state for a zone.
Response:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
Possible status values: disabled, pending_ds, active, rotating_ksk, rotating_zsk.
POST /api/v1/domains/{domain_id}/dnssec/enable#
Enable DNSSEC for a zone. Generates KSK and ZSK, signs the zone, and returns DS records to publish at the registrar. If the parent zone is one ScaiDNS also hosts, the DS records are additionally published into that parent automatically (see DS auto-publish to a hosted parent).
Request:
| Field | Type | Required | Notes |
|---|---|---|---|
algorithm |
integer | No | DNSSEC algorithm number; default 13 |
Supported algorithms: 8 (RSA/SHA-256), 10 (RSA/SHA-512), 13 (ECDSA P-256), 14 (ECDSA P-384), 15 (Ed25519).
Response:
1 2 3 4 5 6 7 8 | |
Errors:
409— DNSSEC already enabled on this zone.400— Unsupported algorithm.
POST /api/v1/domains/{domain_id}/dnssec/disable#
Disable DNSSEC and remove all signing keys.
Response:
1 2 3 4 5 | |
Important: Remove DS records at the registrar before calling this, or resolvers will see broken DNSSEC and return SERVFAIL. When the parent is a ScaiDNS-hosted zone, ScaiDNS withdraws the DS from it as part of this call.
POST /api/v1/domains/{domain_id}/dnssec/rotate-zsk#
Rotate the Zone Signing Key. Transparent to registrars; ScaiDNS manages the rollover automatically.
Response: New ZSK info, old ZSK marked for retirement.
POST /api/v1/domains/{domain_id}/dnssec/rotate-ksk#
Rotate the Key Signing Key. Returns the new DS record that needs to be published at the registrar. Status changes to rotating_ksk until /confirm-ds-published is called. When the parent is a ScaiDNS-hosted zone, the new DS is added to it automatically (alongside the old one) and the old DS is removed once the previous KSK finishes retiring.
Response:
1 2 3 4 5 6 7 8 9 | |
POST /api/v1/domains/{domain_id}/dnssec/confirm-ds-published#
Record that DS records have been published at the registrar. Transitions the zone out of pending_ds or rotating_ksk.
Request:
1 2 3 4 5 | |
Response:
1 2 3 4 5 | |
ScaiDNS validates the provided DS records against the zone's current KSKs. Mismatches return 400.
POST /api/v1/domains/{domain_id}/dnssec/sync#
Force a sync between ScaiDNS and PowerDNS for DNSSEC state. Use if the two get out of step (rare).
Response: Current state after sync.
DS auto-publish to a hosted parent#
When a signed zone's nearest parent is another zone ScaiDNS hosts (an internal delegation), ScaiDNS keeps the child's DS records in that parent in sync with the child's keys — no registrar step. It happens as a side effect of the lifecycle calls above:
| Call | Effect on the hosted parent |
|---|---|
enable |
Publishes the child's DS (SHA-256 and SHA-384) at the child's name. |
rotate-ksk |
Adds the new KSK's DS alongside the old; both remain during rollover. |
confirm-ds-published / key retirement |
Drops a retired KSK's DS once it is fully retired. |
disable |
Removes the child's DS entirely. |
Details:
- Any hosted parent, including cross-tenant. The parent is the nearest zone ScaiDNS hosts above the child, even if it belongs to a different tenant. If no hosted parent exists (the parent is a TLD/registrar), this is a no-op and the registrar flow applies.
- Opt-out per zone. Set the domain's
manage_parent_dssetting tofalseto disable auto-publish and manage the DS by hand. - Idempotent and self-healing. The parent's DS rrset is reconciled to exactly match the child's non-retired KSKs on every key change; a manually deleted DS is restored on the next change.
- Audited. Each parent write is logged as
dnssec.ds_publishedordnssec.ds_withdrawn(actor typesystem).
See Delegate a subzone securely for a walkthrough.
Algorithms reference#
| Number | Name | Recommendation |
|---|---|---|
8 |
RSA/SHA-256 | Legacy; avoid for new zones |
10 |
RSA/SHA-512 | Rarely used |
13 |
ECDSA P-256 / SHA-256 | Default choice |
14 |
ECDSA P-384 / SHA-384 | Larger signatures; usually unnecessary |
15 |
Ed25519 | Modern; verify TLD/registrar support |
Error codes#
| Status | Meaning |
|---|---|
400 |
Unsupported algorithm; invalid DS record; confirmation of non-matching DS |
403 |
Caller lacks dnssec:* permission |
404 |
Domain not found |
409 |
Invalid state transition (e.g., enable when already enabled) |