DNSSEC
Last updated
M15. Per-domain, opt-in. ADR-0057.
Model
Each hosted zone can be signed independently. Toggle per-domain at Domains → Edit → DNSSEC (admin) or /jabali-panel/domains/edit/:id → DNSSEC (owner). No global on/off.
When enabled, the agent runs:
pdnsutil secure-zone <domain>
pdnsutil rectify-zone <domain>
…which generates a KSK (Key-Signing Key) and a ZSK (Zone-Signing Key) and signs every RRSet.
Key persistence
PDNS stores keys in its MariaDB backend (domainmetadata, cryptokeys). The Jabali panel also caches key metadata + the DS record in its own dnssec_keys table (admin- and user-visible) so the UI can show the DS record without shelling to pdnsutil per page load.
Operator workflow
- Toggle DNSSEC on.
- Wait for “secured” badge in the UI (≤2 s typical).
- Copy the DS record displayed in the DNSSEC card.
- Publish the DS record at the parent registrar (where your domain is registered, Namecheap, Gandi, Cloudflare Registrar, etc.).
- Wait for the parent registrar to push the DS into the parent zone (usually minutes; up to TTL of the parent zone).
- Verify with
dig +dnssec @8.8.8.8 example.com SOA→ look forad(Authenticated Data) flag.
Until step 5 is done, your zone is signed but not part of the chain of trust. Resolvers that don’t validate will keep working; resolvers that validate will see the zone as “signed but unsigned by parent”, generally treated as if unsigned. Safe.
Algorithm choice
Default: KSK = ECDSAP256SHA256 (algorithm 13), ZSK = ECDSAP256SHA256. Modern, small, fast. PowerDNS picks this when invoked without --algorithm.
(If you have a registrar that doesn’t support algorithm 13, override via pdnsutil add-zone-key <domain> ksk rsasha256 2048 and adjust the displayed DS accordingly. The UI doesn’t currently expose this; CLI-only.)
Rotation
Not automatic. Manual rotation:
pdnsutil activate-zone-key <domain> <new-key-id>
pdnsutil deactivate-zone-key <domain> <old-key-id>
# wait for old DS TTL to expire
pdnsutil remove-zone-key <domain> <old-key-id>
KSK rotation requires re-publishing the DS at the parent registrar.
What is not covered
-
NSEC vs NSEC3: Jabali uses NSEC by default. To switch a zone to NSEC3 (zone-walk resistance):
pdnsutil set-nsec3 <domain> '1 0 1 ab' pdnsutil rectify-zone <domain> -
CDS / CDNSKEY automation (RFC 7344): parent registrar must support it. Not currently published by Jabali; on the roadmap.
-
Algorithm rollover automation.
Live verification
End-to-end DNSSEC signing was live-verified on 192.168.100.150 (2026-04-25): zone signed, DS published at the test registrar, dig +dnssec returned ad.