Re: [BIND-users] DNSSEC Key Management: Using dns sec-policy with Externally Generated Keys — KASP Auto-Ret iring Newly Copied Keys
Matthijs Mekking <[email protected]> Thu, 19 Mar 2026 10:18:58 +0100
| Newsgroups | gmane.network.dns.bind9.user |
|---|---|
| Message-ID | <0d2f3c12-c8c2-46b0-937e-134c8a021efc__38652.2648784862$1773911992$gmane$org@isc.org> |
Hi Nagesh, Please seem my comments inline. On 3/18/26 13:11, Nagesh Thati wrote: > Hello Matthijs, > > I wanted to follow up on my earlier question regarding using dnssec- > policy with externally generated keys in BIND 9.18.35 and share that the > suggested approach worked successfully. > > To summarize what worked for our implementation: > > 1. Using the -G flag with dnssec-keygen to generate pregenerated keys > with no timing metadata (only the Created field is present). This was > the key insight we were missing — our keys previously had full timing > metadata which caused BIND's KASP engine to mishandle them. Sounds good. > 2. Copying the pregenerated keys to the key directory and running 'rndc > loadkeys' is sufficient for BIND to detect and schedule the rollover > automatically. There is no need to run 'rndc dnssec -rollover' for > normal lifecycle rollovers — doing so prematurely caused immediate key > deletion in our testing, bypassing the double-signature phase entirely. Correct. Only if you have key lifetime unlimited, you will need to run 'rndc dnssec -rollover'. Some operators like to control when they start rolling their key (external to BIND 9), but you can rely on dnssec-policy's key lifetime, as long as you pregenerate the keys before the successor needs to be pre-published. > 3. BIND's KASP engine correctly treats keys generated with -G as > successor candidates and manages all timing, pre-publication, and > activation automatically based on the dnssec-policy configuration. > > One additional observation that may be useful to others: copying > successor keys too early (well before the rollover window) causes BIND > to set GoalState: hidden on the new keys, effectively rejecting them. > The successor key should be copied within a reasonable window before the > scheduled rollover — not immediately after the current key is activated. The GoalState and other states on pregenerated keys are initialized to hidden. That should not prevent those keys from being selected as a successor. In other words, it shouldn't matter when you copy the keys to the key-directory. If you observed differently, please provide a reproducer and create a new issue: https://gitlab.isc.org/isc-projects/bind9/-/issues/new > We are now successfully using this approach to externally manage DNSSEC > key generation while letting BIND handle all signing, re-signing, and > rollover operations automatically via dnssec-policy. Great to hear! Do you have any recommendations on how to improve our documentation, to avoid common pitfalls for others? > Thank you again for the guidance and for pointing us to the relevant > section of the ISC Knowledge Base. It made a significant difference in > our implementation. Glad I could be of assistance, Best regards, Matthijs > Thanks, > Nagesh > > On Tue, Mar 17, 2026 at 2:53 PM Matthijs Mekking <[email protected] > <mailto:[email protected]>> wrote: > > Hello Nagesh, > > This should be possible, this section of the KB article should be of > interest to you: > > https://kb.isc.org/docs/dnssec-key-and-signing-policy#importing- > dnssec-keys <https://kb.isc.org/docs/dnssec-key-and-signing- > policy#importing-dnssec-keys> > > The takeaway is that you should not set timing metadata in the key > files > (other than Created). Keys without timing metadata are considered > pregenerated keys and are eligible candidates to become successor keys. > > Also don't set "Predecessor"/"Successor" metadata, dnssec-policy will > set those when selecting a successor key. > > Furthermore, depending on what 9.18 version you are running, there may > be bugs in older versions that cause existing keys to retire too soon. > > > On 3/17/26 06:02, Nagesh Thati wrote: > > Hello BIND Community, > > > > I am working on a solution that integrates with BIND 9.18 for > DNSSEC key > > management. I would like to share a behavior I have observed and > seek > > guidance from the community on the best approach. > > > > > > Background > > ========== > > > > Our architecture is as follows: > > > > - My solution is responsible for generating DNSSEC keys (KSK and > ZSK) > > using dnssec-keygen. > > - The generated keys are copied to the BIND key directory > configured via > > the key-directory directive. > > - BIND is configured with dnssec-policy to handle automatic zone > signing > > and re-signing. > > - My solution monitors key Inactive times and generates new > replacement > > keys ahead of rollover, copying them to the key directory when > rollover > > time approaches. > > - We then run 'rndc loadkeys <zone>' to signal BIND to pick up > the new keys. > > > > Our dnssec-policy configuration is as follows: > > > > dnssec-policy "managed-keys" { > > keys { > > ksk lifetime P365D algorithm ecdsap256sha256; > > zsk lifetime P30D algorithm ecdsap256sha256; > > }; > > }; > > zone "dnssectest.com <http://dnssectest.com> <http:// > dnssectest.com <http://dnssectest.com>>" IN { > > type master; > > file "/var/named/zones/db.dnssectest.com <http:// > db.dnssectest.com> <http:// > > db.dnssectest.com <http://db.dnssectest.com>>"; > > key-directory "/var/named/keys"; > > inline-signing yes; > > dnssec-policy "managed-keys"; > > }; > > > > Observed Issue > > ============== > > > > When testing our key rollover logic, we simulate an approaching > expiry > > by manually changing the Inactive time of the current ZSK or KSK > to 2-3 > > days from now. We then generate a new replacement key and copy it > to the > > key directory, followed by running 'rndc loadkeys'. > > > > The observed behavior is: > > > > 1. For ZSK rollover: BIND's KASP engine detects the newly copied > ZSK in > > the key directory and automatically retires it, instead of > treating it > > as the incoming replacement key. > > > > 2. For KSK rollover: The same behavior is observed — the newly > copied > > KSK is auto-retired by KASP shortly after being picked up. > > > > This appears to happen because BIND's KASP engine takes ownership > of all > > keys present in the key directory and manages their lifecycle > > independently, overriding the timing metadata we have set on the > newly > > copied keys. > > > > > > Questions > > ========= > > > > 1. Is there a supported way to use dnssec-policy while having an > > external application manage key generation and rollover, with > BIND only > > responsible for signing and re-signing? > > No. BIND can do DNSSEC maintenance for you, or you have to do key and > signature maintenance manually with dnssec-signzone. > > Your best choice is to set key lifetimes to unlimited, and when > there is > a new key rollover, drop the key files into the configured key- > directory > and issue a 'rndc dnssec -rollover' command. > > > > 2. Is there a mechanism to signal to BIND's KASP engine that a newly > > copied key should be treated as a pre-publication replacement key > for an > > upcoming rollover, rather than a new independent key? > > As you have experienced, excess keys with key timing metadata will be > retired. Try copying the key files of the successor key without setting > timing metadata. > > > 3. Does BIND 9.18's KASP engine honor the Publish, Activate, > Inactive, > > and Delete timing metadata set on externally generated keys when > they > > are copied to the key directory, or does it always recalculate and > > override these values based on the active dnssec-policy? > > Nope. BIND will set those timing metadata given the dnssec-policy. > It is > merely used to inform the user when it can expect a key to become > published, active, inactive and removed from the zone. > > > > 4. Is the 'auto-dnssec maintain' directive (without dnssec- > policy) still > > a viable option for this use case in BIND 9.18, given that it is > > deprecated? Are there plans to remove it in an upcoming release? > > It is already removed in 9.20, so I wouldn't consider it viable. > > > > 5. Are there any plans in future BIND versions to support an > "external > > key provider" interface or a "bring your own key" (BYOK) model > within > > the KASP framework? > > It should work as I described above. > > If not, feel free to create an issue in our GitLab: > https://gitlab.isc.org/isc-projects/bind9/-/issues/new <https:// > gitlab.isc.org/isc-projects/bind9/-/issues/new> > > > Best regards, > > Matthijs > > > > What We Have Tried > > ================== > > > > - Using 'lifetime unlimited' in dnssec-policy to prevent BIND > from auto- > > generating replacement keys. However, BIND still auto-retires newly > > copied keys when it detects them in the key directory. > > > > - Using 'auto-dnssec maintain' with 'inline-signing yes' without > dnssec- > > policy. This works correctly and respects our key timing > metadata, but > > we are concerned about relying on a deprecated directive for a > > production system. > > > > - Manually editing the .private file and running 'rndc loadkeys'. > BIND > > picks up the timing changes but KASP still overrides the lifecycle > > management of newly added keys. > > > > > > Environment > > =========== > > > > - BIND Version: 9.18.x > > - OS: Alma Linux > > - Key Algorithm: ECDSAP256SHA256 > > - ZSK Lifetime: 30 days > > - KSK Lifetime: 365 days > > > > > > Any guidance, suggestions, or pointers to relevant documentation or > > discussions would be greatly appreciated. We want to ensure our > > implementation is aligned with BIND's intended design and is > forward- > > compatible with future releases. > > > > Thank you for your time and assistance. > > > > Best regards > > Nagesh > > > > -- > Visit https://lists.isc.org/mailman/listinfo/bind-users <https:// > lists.isc.org/mailman/listinfo/bind-users> to unsubscribe from this > list. > -- Visit https://lists.isc.org/mailman/listinfo/bind-users to unsubscribe from this list.