[Kea-users] Kea DHCP DDNS 3.0.3 + GSS TSIG hook: gss_init_sec_context fails (“No credentials”) against Microsoft DNS (AD)

Jaroslav Čihák cihak.jarda at gmail.com
Tue May 5 07:40:34 UTC 2026


Dear all,


I’m trying to use Kea DHCP‑DDNS (D2) with the GSS‑TSIG hook
(libddns_gss_tsig.so) to perform secure DDNS updates against Microsoft DNS
(Active Directory). The GSS‑TKEY exchange fails immediately at GSS context
initialization.

I’m attaching ~30 lines of log around the first failure plus the relevant
D2 configuration excerpt and the Kerberos/systemd settings used to run D2.



*Environment*

   - OS: RHEL 9.x
   - Kea DHCP‑DDNS (D2): 3.0.3
   - GSS‑TSIG hook: /usr/lib64/kea/hooks/libddns_gss_tsig.so
   - DNS server: Microsoft DNS / AD, dc1.example.local (10.0.0.10)
   - Kerberos realm: EXAMPLE.REALM
   - DHCP/DDNS host: dhcp1.example.local



*Kerberos credentials (keytab + ccache)*

   - Keytab: /etc/kea/client.keytab
      - Principal: host/dhcp1.example.local at EXAMPLE.REALM (kvno 15)
   - We create a FILE ccache for the service user using:
      - sudo -u kea KRB5_CONFIG=/etc/kea/krb5_kea.conf   kinit -k -t
      /etc/kea/ client.keytab -c FILE:/var/lib/kea/krb5/client.ccache
      host/dhcp1.example.local at EXAMPLE.REALM
   - Kerberos config used by the service:
      - /etc/kea/krb5_kea.conf (includes default_ccache_name =
      FILE:/var/lib/kea/krb5/client.ccache)



*D2 / GSS‑TSIG configuration (relevant points)*

   - server-principal: DNS/dc1.example.local at EXAMPLE.REALM
   - DNS server definition:
      - servers: { id: "ad_dns", ip-address: "10.0.0.10", port: 53 }
   - tkey-lifetime: 3600, rekey-interval: 2700 (See attached
   kea-dhcp-ddns.conf.excerpt.json.)



*Error (from kea-dhcp-ddns log)*

During startup, the hook creates a new GSS‑TSIG key and then fails to
initialize the GSS‑TKEY exchange:

   - TKEY_EXCHANGE_FAIL_TO_INIT
   gss_init_sec_context failed
   Major: No credentials were supplied, or the credentials were unavailable
   or inaccessible (458752)
   Minor: SPNEGO cannot find mechanisms to negotiate (100001)

The exact log context is attached (kea-dhcp-ddns.log.excerpt.txt).



*How D2 is started (systemd)*

The service runs as user kea and we set the following environment:

   - KRB5_CONFIG=/etc/kea/krb5_kea.conf
   - KRB5CCNAME=FILE:/var/lib/kea/krb5/client.ccache
   - GSS_USE_PROXY=no (Full relevant excerpt attached in
   systemd-override-and-krb5.conf.excerpt.txt.)



*What we verified*

   - kinit/klist/kvno works for the keytab principal and FILE ccache when
   run as the service user.
   - The failure appears specific to the GSS‑TSIG hook’s acquisition of
   initiator credentials / context initialization inside D2.



*Questions*

   1. What is the recommended, supported way in Kea 3.0.x GSS‑TSIG hook to
   supply initiator credentials for AD DNS updates (keytab-only vs FILE ccache
   vs cache collection/KCM)?
   2. When a FILE ccache exists and KRB5CCNAME/default_ccache_name are set
   to FILE, should the hook rely on that, or does it still attempt to use
   other cache mechanisms?
   3. Is there a canonical minimal hook configuration for Microsoft AD DNS
   in Kea 3.0.x (required parameters for client identity vs server-principal)?



Thank you in advance for any guidance.



Best regards,
Jaroslav Cihak



*Attachments:*

   1. kea-dhcp-ddns.conf.excerpt.json
   2. kea-dhcp-ddns.log.excerpt.txt (~30 lines)
   3. systemd-override-and-krb5.conf.excerpt.txt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.isc.org/pipermail/kea-users/attachments/20260505/02b32488/attachment-0001.htm>
-------------- next part --------------
[libdefaults]
default_realm = EXAMPLE.REALM
rdns = false
dns_canonicalize_hostname = false
dns_lookup_realm = false
dns_lookup_kdc = false
default_ccache_name = FILE:/var/lib/kea/krb5/client.ccache
forwardable = true
proxiable = true

[realms]
EXAMPLE.REALM = {
  kdc = dc1.example.local
  kdc = dc2.example.local
  kdc = dc3.example.local
  admin_server = dc1.example.local:88
  admin_server = dc2.example.local:88
  admin_server = dc3.example.local:88
  default_domain = example.local
}

[domain_realm]
.dhcp1.example.local = EXAMPLE.REALM
.dc1.example.local = EXAMPLE.REALM
.example.local = EXAMPLE.REALM


# /etc/systemd/system/kea-dhcp-ddns.service.d/override.conf
[Service]
Environment="KRB5_CONFIG=/etc/kea/krb5_kea.conf"
Environment="KRB5_KTNAME=/etc/kea/client.keytab"
Environment="KRB5CCNAME=FILE:/var/lib/kea/krb5/client.ccache"
Environment="KRB5_TRACE=/var/log/kea/krb5.trace"
Environment="GSSAPI_MECH_CONF=/etc/gss/mech.d/krb5.conf"
Environment="GSS_USE_PROXY=no"
Environment="LD_LIBRARY_PATH=/usr/lib64"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: kea-dhcp-ddns.conf.excerpt.json
Type: application/json
Size: 911 bytes
Desc: not available
URL: <https://lists.isc.org/pipermail/kea-users/attachments/20260505/02b32488/attachment-0001.json>
-------------- next part --------------
2026-05-05 08:34:19.594 INFO  [kea-dhcp-ddns.gss-tsig-hooks/157334.140102359381888] GSS_TSIG_LOAD_OK GSS-TSIG hooks library loaded successfully.
2026-05-05 08:34:19.594 INFO  [kea-dhcp-ddns.hooks/157334.140102359381888] HOOKS_LIBRARY_LOADED hooks library /usr/lib64/kea/hooks/libddns_gss_tsig.so successfully loaded
2026-05-05 08:34:19.595 INFO  [kea-dhcp-ddns.commands/157334.140102359381888] COMMAND_ACCEPTOR_START Starting to accept connections via unix domain socket bound to /var/run/kea/kea-ddns-ctrl.sock
2026-05-05 08:34:19.595 INFO  [kea-dhcp-ddns.dctl/157334.140102359381888] DCTL_CONFIG_COMPLETE server has completed configuration: listening on 127.0.0.1, port 53001, using UDP
2026-05-05 08:34:19.595 DEBUG [kea-dhcp-ddns.callouts/157334.140102359381888] HOOKS_CALLOUTS_BEGIN begin all callouts for hook d2_srv_configured
2026-05-05 08:34:19.595 DEBUG [kea-dhcp-ddns.callouts/157334.140102359381888] HOOKS_CALLOUTS_COMPLETE completed callouts for hook d2_srv_configured (total callouts duration: 0.023 ms)
2026-05-05 08:34:19.595 DEBUG [kea-dhcp-ddns.gss-tsig-hooks/157334.140102359381888] GSS_TSIG_MANAGER_STARTED hooks library GSS-TSIG key periodic manager started.
2026-05-05 08:34:19.596 INFO  [kea-dhcp-ddns.gss-tsig-hooks/157334.140102359381888] GSS_TSIG_NEW_KEY new GSS-TSIG key '2112759240.sig-dc1.example.local.' was created.
2026-05-05 08:34:19.596 DEBUG [kea-dhcp-ddns.gss-tsig-hooks/157334.140102359381888] START_RETRY_TIMER started timer handling retry for server ad_dns in 120 seconds.
2026-05-05 08:34:19.597 ERROR [kea-dhcp-ddns.gss-tsig-hooks/157334.140102359381888] TKEY_EXCHANGE_FAIL_TO_INIT GSS-TKEY exchange failed to initialize because of the error: gss_init_sec_context failed with GSSAPI error: Major = 'No credentials were supplied, or the credentials were unavailable or inaccessible' (458752), Minor = 'SPNEGO cannot find mechanisms to negotiate' (100001)..
2026-05-05 08:34:19.597 WARN  [kea-dhcp-ddns.gss-tsig-hooks/157334.140102359381888] GSS_TSIG_NEW_KEY_SETUP_FAILED new GSS-TSIG key '2112759240.sig-dc1.example.local' setup failed: other, unclassified error.
2026-05-05 08:34:19.597 INFO  [kea-dhcp-ddns.dhcpddns/157334.140102359381888] DHCP_DDNS_STARTED Kea DHCP-DDNS server version 3.0.3 started


More information about the Kea-users mailing list