iret = Iret(config, zsk=False, ksk=True)
# Test #2375: Scheduled rollovers are happening faster than they can finish.
- zone = "three-is-a-crowd.kasp"
isctest.log.info(
"check that fast rollovers do not remove dependent keys from zone (#2375)"
)
offset1 = -int(timedelta(days=60).total_seconds())
offset2 = -int(timedelta(hours=27).total_seconds())
- isctest.kasp.check_dnssec_verify(server, zone)
- keyprops = [
- f"ksk {lifetime_policy} {alg} {size} goal:hidden dnskey:omnipresent krrsig:omnipresent ds:unretentive offset:{offset1}",
- f"ksk {lifetime_policy} {alg} {size} goal:omnipresent dnskey:omnipresent krrsig:omnipresent ds:rumoured offset:{offset2}",
- f"zsk unlimited {alg} {size} goal:omnipresent dnskey:omnipresent zrrsig:omnipresent offset:{offset1}",
- ]
- expected = isctest.kasp.policy_to_properties(ttl, keyprops)
+ zone = "three-is-a-crowd.kasp"
+ step = {
+ "zone": zone,
+ "cdss": cdss,
+ "keyprops": [
+ f"ksk {lifetime_policy} {alg} {size} goal:hidden dnskey:omnipresent krrsig:omnipresent ds:unretentive offset:{offset1}",
+ f"ksk {lifetime_policy} {alg} {size} goal:omnipresent dnskey:omnipresent krrsig:omnipresent ds:rumoured offset:{offset2}",
+ f"zsk unlimited {alg} {size} goal:omnipresent dnskey:omnipresent zrrsig:omnipresent offset:{offset1}",
+ ],
+ "keyrelationships": [0, 1],
+ }
+ isctest.kasp.check_rollover_step(servers["ns3"], config, policy, step)
+
+ # Rollover successor KSK (with DS in rumoured state).
+ expected = isctest.kasp.policy_to_properties(ttl, step["keyprops"])
keys = isctest.kasp.keydir_to_keylist(zone, server.identifier)
- ksks = [k for k in keys if k.is_ksk()]
- zsks = [k for k in keys if not k.is_ksk()]
isctest.kasp.check_keys(zone, keys, expected)
- expected[0].metadata["Successor"] = expected[1].key.tag
- expected[1].metadata["Predecessor"] = expected[0].key.tag
- isctest.kasp.check_keyrelationships(keys, expected)
- for kp in expected:
- kp.set_expected_keytimes(config, offset=None)
- isctest.kasp.check_keytimes(keys, expected)
- isctest.kasp.check_dnssecstatus(server, zone, keys, policy=policy)
- isctest.kasp.check_apex(server, zone, ksks, zsks, cdss=cdss)
- isctest.kasp.check_subdomain(server, zone, ksks, zsks)
- # Rollover successor KSK (with DS in rumoured state).
key = expected[1].key
now = KeyTimingMetadata.now()
with server.watch_log_from_here() as watcher:
server.rndc(f"dnssec -rollover -key {key.tag} -when {now} {zone}")
watcher.wait_for_line(f"keymgr: {zone} done")
- isctest.kasp.check_dnssec_verify(server, zone)
+
# We now expect four keys (3x KSK, 1x ZSK).
- keyprops = [
- f"ksk {lifetime_policy} {alg} {size} goal:hidden dnskey:omnipresent krrsig:omnipresent ds:unretentive offset:{offset1}",
- f"ksk {lifetime_policy} {alg} {size} goal:hidden dnskey:omnipresent krrsig:omnipresent ds:rumoured offset:{offset2}",
- f"ksk {lifetime_policy} {alg} {size} goal:omnipresent dnskey:rumoured krrsig:rumoured ds:hidden offset:0",
- f"zsk unlimited {alg} {size} goal:omnipresent dnskey:omnipresent zrrsig:omnipresent offset:{offset1}",
- ]
- expected = isctest.kasp.policy_to_properties(ttl, keyprops)
+ step = {
+ "zone": zone,
+ "cdss": cdss,
+ "keyprops": [
+ f"ksk {lifetime_policy} {alg} {size} goal:hidden dnskey:omnipresent krrsig:omnipresent ds:unretentive offset:{offset1}",
+ f"ksk {lifetime_policy} {alg} {size} goal:hidden dnskey:omnipresent krrsig:omnipresent ds:rumoured offset:{offset2}",
+ f"ksk {lifetime_policy} {alg} {size} goal:omnipresent dnskey:rumoured krrsig:rumoured ds:hidden offset:0",
+ f"zsk unlimited {alg} {size} goal:omnipresent dnskey:omnipresent zrrsig:omnipresent offset:{offset1}",
+ ],
+ "check-keytimes": False, # checked manually with modified values
+ }
+ isctest.kasp.check_rollover_step(servers["ns3"], config, policy, step)
+
+ expected = isctest.kasp.policy_to_properties(ttl, step["keyprops"])
keys = isctest.kasp.keydir_to_keylist(zone, server.identifier)
- ksks = [k for k in keys if k.is_ksk()]
- zsks = [k for k in keys if not k.is_ksk()]
isctest.kasp.check_keys(zone, keys, expected)
+
expected[0].metadata["Successor"] = expected[1].key.tag
expected[1].metadata["Predecessor"] = expected[0].key.tag
# Three is a crowd scenario.
isctest.kasp.check_keyrelationships(keys, expected)
for kp in expected:
kp.set_expected_keytimes(config, offset=None)
+
# The first successor KSK is already being retired.
expected[1].timing["Retired"] = now + ipub
expected[1].timing["Removed"] = now + ipub + iret
+
isctest.kasp.check_keytimes(keys, expected)
- isctest.kasp.check_dnssecstatus(server, zone, keys, policy=policy)
- isctest.kasp.check_apex(server, zone, ksks, zsks, cdss=cdss)
- isctest.kasp.check_subdomain(server, zone, ksks, zsks)