[Opendnssec-user] Removing a zone-less key?

Havard Eidnes he at uninett.no
Fri Aug 16 15:16:23 UTC 2024


Hi,

I'm running OpenDNSSEC 2.1.13 and SoftHSM 2.6.1.

For some reason or other, "ods-enforcer key list -v" has started
showing this particular key:

(null)                          KSK      unknown   now                      2048  13         43ff9e6e2c011cd6165f25aa7ac6db83 SoftHSM     45696

It appears that the presence of this key makes "ods-enforcer key
list -z <any-zone>" crash ods-enforcerd with a SEGV, because in
perform_keystate_list() it doesn't check the return value of
key_data_get_zone() (which has several return paths which return
NULL) and consequently ends up calling zone_db_name() with a NULL
argument (which returns NULL), and using that as the first
argument to strcmp(), with predictable results.

The question is: how do I convince OpenDNSSEC that it should
forget about this key?

One would have thought that "ods-enforcer key purge -p <policy>"
would get rid of it.  Not so.  This command essentially does:

  for all zones in policy
     for all keys belonging to this zone
        if key is "dead"
           remove key

and since this particular key is not attached to a zone, it does
not get purged.

To work around this rather annoying issue, I have concocted this
particular patch to OpenDNSSEC:

--- enforcer/src/keystate/keystate_list_cmd.c.orig      2024-08-16 14:50:50.834836266 +0000
+++ enforcer/src/keystate/keystate_list_cmd.c
@@ -199,7 +199,11 @@ perform_keystate_list(int sockfd, db_con
         hsmkey = key_data_get_hsm_key(key);
         key_data_cache_key_states(key);
         tchange = map_keytime(zone, key); /* allocs */
-        if ((printkey != NULL) && (!zonename || !strcmp(zone_db_name(zone), zonename)) && (!keytype || !strcasecmp(keytype,key_data_role_text(key))) && (!keystate || !strcasecmp(keystate, map_keystate(key))))
+        if ((printkey != NULL) && 
+           (!zonename || (zone && !strcmp(zone_db_name(zone), zonename))) && 
+           (!keytype || !strcasecmp(keytype,key_data_role_text(key))) && 
+           (!keystate || !strcasecmp(keystate, map_keystate(key)))
+          )
             (*printkey)(sockfd, zone, key, tchange, hsmkey);
         free(tchange);
         hsm_key_free(hsmkey);

which fixes the crash in ods-enforcerd, and does not print that
un-attached key when you list the keys for a specific zone.
However, the key remains inside OpenDNSSEC even though I think I
managed to delete it from SoftHSM using pkcs11-tool from the
opensc package.

"Help!"

Regards,

- Håvard


More information about the Opendnssec-user mailing list