Skip to content

Enrollment configuration

Paths in the tables are relative to [enroll]. Check parsing and cross-field rules with gdsgate doctor --config <PATH> --json. See the registration lifecycle guide.

[enroll]

Used by: Proxy, Connector.

A standalone Proxy or Connector uses this section to get its transport identity for internal mutual TLS. With endpoint set and a token in the file or in GDSGATE_ENROLL_TOKEN, the node registers on first start. Later starts reuse the identity in state_dir.

For a connector, gdsgate join registers and writes this section without a token.

Key Type Default Purpose
endpoint optional string unset, enrollment off Authority registration URL. A tunnelled connector derives the address from endpoints.proxy_join when this is unset.
token optional string unset One-time registration token. Use GDSGATE_ENROLL_TOKEN or a secret reference (${file:...}, ${env:...}, ${exec:...}) to keep it out of the file. A bare value is the token.
state_dir optional string unset, per-role directory under ~/.gdsgate/state Directory for the persisted transport identity and SSH model A host key.
renew_endpoint optional string unset, derived from the Authority or tunnel relay Authority mTLS endpoint for token-less renewal. It must use https://.
background_renewal bool true Renew the transport certificate while running.
node_name optional string unset Registry label sent on join. Not taken from the host name; must pass the charset and length check.
transport_ca optional string unset, platform trust store PEM anchor for an HTTPS registration listener. Refused with an http:// endpoint. For a certificate the cluster CA issued: the cluster CA; see Registration at an IP address.
transport_sni optional string unset, the host in endpoint TLS server name to verify in place of the dialed host. Use it when endpoint is a loopback or IP address and the certificate is issued for the deployment's name, or when the certificate is issued for an internal name (gdsgate join --enroll-sni). Unset with an IP address in endpoint, the certificate needs an IP entry; see Registration at an IP address.
[enroll]
endpoint       = "http://auth:50050"
renew_endpoint = "https://auth:50051"
state_dir      = "/var/lib/gdsgate/proxy"           # Windows: "C:\\ProgramData\\gdsgate\\state\\proxy"
# token is supplied at boot via GDSGATE_ENROLL_TOKEN

Registration token is single-use

Authority accepts a registration token once. The node then renews its persisted identity over mTLS without a token. Do not keep tokens in the file; supply them at first boot.

renew_endpoint requires the https:// scheme

Renewal is a mutual-TLS call. A renew_endpoint with another scheme is refused at start-up; gdsgate doctor reports it as config.enroll.renew_scheme. The same applies to [admin].endpoint. A node that receives an advertised renewal address with another scheme refuses it and logs the value.

Registration at an IP address

A TLS handshake to an IP address carries no server name. The join relay sends a connection without one to the control plane. A node registering at an https:// IP address therefore sends a fixed server name:

endpoint transport_sni Server name sent Certificate checked against
https://<name>:<port> unset <name> <name>
https://<ip>:<port> unset enroll.gdsgate.internal <ip> (an IP entry)
https://<ip>:<port> set transport_sni transport_sni
http://... - none, cleartext -

enroll.gdsgate.internal routes the connection; a certificate from your own CA does not need it, and one the cluster CA issues (enroll_cert_from_cluster_ca) carries it. Renewal is unchanged: it sends gdsgate.internal.

A certificate the cluster CA issued is verified against that CA: transport_ca names it. gdsgate join --enroll-fingerprint reads it from the listener's chain, checks it against the fingerprint, and writes it beside the identity as <state_dir>/transport-ca.pem; setup prepare writes the Proxy's.

Node versions before this name reach the control plane when they register at an IP address through the join relay, and the registration fails. They can use transport_sni with a name the certificate carries, or an endpoint by name.

Automatic identity renewal

A transport certificate is valid for 24 hours, or for [transport].cert_ttl_secs on the issuing Authority. A Proxy or Connector renews it without a restart or a token:

Step Behavior (24-hour certificate)
Start One hour before expiry, the node calls renew_endpoint over mutual TLS with its current certificate.
Apply The new certificate is written to state_dir and used for new connections and by the listeners. Open connections continue.
Timeouts 10 s for connect and handshakes, 20 s for the call.
Failure Logged at warn, retried with backoff from 30 s to 10 min (about nine attempts within the hour). The node keeps using its current certificate.

These figures scale with the certificate lifetime; a shorter cert_ttl_secs shortens all of them. See [transport]. Renewal never falls back to a registration token.

background_renewal = false turns renewal off. The node then stops accepting new connections when its certificate expires, until it is restarted. Use it only when state_dir is refreshed by other means. gdsgate doctor warns while it is off.

Watch it through gdsgate_transport_identity_expires_in_seconds and gdsgate_transport_identity_renewals_total; see Operations → Metrics.