SPIFFE / SPIRE
Sectigo Edge uses SPIFFE as its workload identity contract and SPIRE as the preferred production implementation. Your existing SPIRE Server and Agents keep issuing and rotating X.509-SVIDs through the standard Workload API. Sectigo Edge adds registration review, policy, PKI lifecycle and evidence on top — and, when you enable it, a Mesh Node beside SPIRE Server turns approved service claims into SPIRE registration entries automatically.
What the integration does
- A new service (using the Sectigo Edge SDK) announces itself to a nearby Mesh Node and proves possession of its key. An announcement alone never creates a SPIRE entry.
- An administrator reviews and claims it in ConsoleService claims with fresh MFA, approving only node-derived selectors.
- Sectigo Edge issues a short-lived, signed registration grant for that node.
- The node verifies the grant against its pinned registration trust (
registration_trust_bundle_file, maximum lifetimeregistration_grant_max_ttl_seconds), re-derives the selectors from its own observation, and creates exactly one entry through the SPIRE Server Entry API over a local Unix socket. - The node compares every returned field before reporting the entry as applied.
| Sectigo Edge claim field | SPIRE entry field |
|---|---|
| Approved SPIFFE ID | spiffe_id |
spire_parent_id from the node configuration | parent_id |
| Node-observed runtime facts | selectors |
| Maximum identity lifetime | x509_svid_ttl / jwt_svid_ttl |
| Claim ID and announcement digest | deterministic entry hint |
The connector treats both OK and ALREADY_EXISTS from SPIRE only as candidates, and accepts the result only if SPIFFE ID, parent, selectors, both TTLs, hint and every privilege-bearing field match. Unauthenticated TCP, join-token reuse and calling the SPIRE CLI are not supported.
Requirements
- A Linux or Kubernetes Mesh Node running on, or co-located with, the SPIRE Server, with access to the Server API socket. Windows nodes cannot enable this connector (configuration rejects it).
- The SPIRE Server API Unix socket must not be a symbolic link or world-writable.
- Workloads use the SPIRE Agent's Workload API (
SPIFFE_ENDPOINT_SOCKET): a Unix socket on Linux, a named pipe on Windows. Windows workloads should discover a Linux/Kubernetes node adjacent to SPIRE Server so the same node observes the claim and applies the grant.
Prepare the host
Confirm the socket path and permissions (example path):
ls -l /run/spire/server/private/api.sock
srw-rw---- 1 spire spire 0 Oct 1 09:12 /run/spire/server/private/api.sock
Grant the node's service identity access to that socket in a way your SPIRE operators approve (for example through group membership on Linux). Do not make the socket world-writable — the node refuses it.
Node configuration
- Linux
- Kubernetes
{
"spire_enabled": true,
"spire_server_api_socket": "/run/spire/server/private/api.sock",
"spire_parent_id": "spiffe://acme-corp.example/spire/agent/k8s_psat/prod-cluster/node-01"
}
helm upgrade mesh ./edgepki-node --namespace edgepki --reuse-values \
--set spire.enabled=true \
--set spire.parentId=spiffe://acme-corp.example/spire/agent/k8s_psat/prod-cluster/node-01 \
--set spire.socketHostPath=/run/spire/server/private
spire.socketHostPath is the host directory that contains the socket; it is mounted at the directory of spire.serverApiSocket (default /run/spire/server/private/api.sock).
spire_server_api_socket must be absolute and spire_parent_id a valid SPIFFE ID. The values above are examples.
Configure in the console
- Open ConsoleIntegrations and select Configure on SPIFFE identities.
- Select Enable this integration and choose the Linux/Kubernetes node(s) next to SPIRE Server.
- Keep or enter the identity profile (default
workload-mtls). The Local adapter reference is fixed tobuiltin/spire. - Select Save desired state.
- Review and claim new services in ConsoleService claims.
Policy and rotation
SPIRE generates and rotates workload private keys and SVIDs; applications consume updates through the official SPIFFE libraries. Sectigo Edge does not run dual-slot rotation for SVIDs. The node only accepts grants signed by your registration authority and only within registration_grant_max_ttl_seconds; a policy signing key cannot create a workload identity. Cloud failback from the SDK is allowed only after a transport-level connection failure — an invalid SVID, signature, policy or authorization denial is final.
Verify
- The SPIFFE identities card shows Healthy.
- After claiming a service, the entry exists in SPIRE:
spire-server entry show -spiffeID spiffe://acme-corp.example/ns/prod/sa/payments
Found 1 entry
Entry ID : 3a7f2c1e-8b4d-4e9a-9c61-0f5d2b7e4a13
SPIFFE ID : spiffe://acme-corp.example/ns/prod/sa/payments
Parent ID : spiffe://acme-corp.example/spire/agent/k8s_psat/prod-cluster/node-01
Revision : 0
X509-SVID TTL : 3600
JWT-SVID TTL : 300
Selector : k8s:ns:prod
Selector : k8s:sa:payments
(Example output; your selectors and TTLs come from the approved claim.) The node's Prometheus metrics edgepki_node_registration_sync_total and edgepki_node_registration_applied_total count synchronization attempts and applied grants.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
Node will not start: direct SPIRE Server Entry API reconciliation requires a Linux or Kubernetes Mesh Node | spire_enabled on a Windows node | Use a Linux/Kubernetes node beside SPIRE Server |
Node will not start: spire_server_api_socket must be absolute and spire_parent_id must be a valid SPIFFE ID when SPIRE is enabled | Invalid configuration | Fix the two keys |
Node will not start: SPIRE reconciliation initialization failed | Socket missing, a symbolic link, world-writable or not accessible | Fix the socket path and permissions |
Card Degraded with spire_not_configured | The assigned node does not have SPIRE enabled | Enable it on that node or assign another node |
Card Degraded with adapter_reference_invalid | A reference other than builtin/spire was saved | Re-save the integration |
| Claim approved but no entry appears | Grant rejected (wrong tenant/node, expired or untrusted) or SPIRE returned an entry that did not match | Check the node log for reject untrusted service registration grant or apply service registration grant, and the registration sync metrics |
