Certificate authorities

Run certificate authorities in your Burrow that sign SSH user certificates for your machines, rotate their keys on your schedule, and choose the hosts that trust each one.

Updated Oct 14, 2026

A certificate authority (CA) signs certificates that hosts trust. Your Burrow runs its own CAs for SSH user certificates: a machine fetches a certificate from an SSH user dynamic secret, the secret's CA signs it, and every host the CA is attached to accepts it for SSH logins until it expires.

A CA's signing keys are made in your Burrow and stay there, sealed under its master key like your secrets' values. Hosts trust a CA through their node: your Burrow sends each node the keys of the CAs attached to it and the certificates they revoked, and the node sets up its host's sshd with them.

Create a certificate authority#

  1. Open Certificate authorities and select the + at the top right of the table.

  2. Name the CA. A name is lowercase letters, digits and hyphens, starting with a letter, up to 64 characters, and spaces turn into hyphens as you type.

  3. Pick the nodes whose hosts are to trust it. A CA needs at least one.

  4. Set its key rotation, described below, and select Create.

The dialog turns into the new CA's details, its trust anchor among them. Its first signing key is an Ed25519 key.

Without read and write on Nodes, the dialog says so in place of the form. With no nodes yet, it offers Add node, which opens the Nodes page's own dialog, or Go to Nodes when a node token is out and no node has registered with it yet.

Key rotation#

A CA's signing key is replaced by a handover: the new key is trusted on your hosts before it signs anything, and the key it replaces stays trusted until everything it signed has expired, so a rotation leaves every certificate working.

Setting

What it does

Rotate every

Off, a new key is prepared when you rotate by hand. On, one is prepared every 1 to 3650 days, counted from when the signing key started signing.

Switch after

On, a new key starts signing 1 to 720 hours after it's prepared. Off, it waits until you switch to it.

A new CA rotates by hand and switches to a new key 48 hours after it's prepared. Change either later with Rotation settings from the CA's row menu. A key already waiting follows the new switch setting, counted from when it was prepared.

Rotate, switch and replace keys#

The CA's row menu carries what fits where its rotation stands:

Action

What it does

Rotate now

Prepares a new key now. Your hosts trust it from then, and it starts signing after the switch delay, or when you switch to it.

Switch to new key

Makes the waiting key the signing key now. The previous key stays trusted until everything it signed has expired.

Remove new key

Drops a waiting key that never signed. The current key keeps signing.

Replace key now

For a key you believe is compromised. A new key signs from then on, and the current key leaves the trust anchor at once, so every certificate it signed stops working once your hosts have the new trust anchor. A key waiting to be switched to is dropped too.

Details#

The table shows each CA's signing key fingerprint, where its rotation stands, and when it was made, with a tag beside its name counting the secrets that issue from it. Details in its row menu shows the rest, and follows changes as they happen:

  • Its status, what it signs, its key algorithm, and where your Burrow's master key is kept.

  • Its rotation: how often, what comes next, and when a new key switches.

  • Every signing key, newest first, with its fingerprint and state: Signing, New, Retiring, Replaced or Removed.

  • Its nodes, and where each host stands with it: On its host, Waiting while the node is offline or the change is on its way, or Failed, with the node's reason.

  • Its trust anchor: the lines a host's TrustedUserCAKeys file holds to trust it, with a copy button.

  • The secrets that issue from it, by project, environment and name, or how many to a member who can't read secrets.

Nodes#

A CA is trusted on the hosts of the nodes it's attached to. Change them in its details: pick or clear nodes, then select Save. Attaching a node puts the CA on its host, and detaching takes it off. Removing a node detaches it from its CAs.

A member without read and write on Nodes sees a CA's nodes greyed, and a member who can't read nodes sees how many there are.

On the host#

Each node is sent the keys and revocations of its CAs when it connects and whenever one of them changes, and every ten minutes it checks its host again and puts back anything that went missing. On the host it works with what's there:

  • When sshd already trusts a CA file, the node keeps its keys in a marked section of that file. The keys already in it, and any added later, stay as they are.

  • When sshd trusts none, the node keeps its own file in /etc/ssh/ratel-node and points sshd at it from a marked section at the top of sshd_config. The change is checked with sshd -t first and sshd is reloaded after; if sshd won't reload, sshd_config is put back as it was.

  • Revocations go into the host's own revocation list when it has one, added with ssh-keygen to a binary list or as a marked section of keys in a plain-text one. Without one, the node keeps its own.

Every file is written whole and renamed into place. After the first time, a new CA, a rotation or a revocation only rewrites files, which sshd reads at its next login. SSH sessions still open with a revoked certificate are ended, as described in Dynamic secrets.

SSH trust is set up on Linux hosts with OpenSSH, by ratel-node 0.2.0 and later. Ending revoked sessions takes ratel-node 0.2.1.

Disable, delete and restore#

Action

What happens

Disable

The CA stops issuing until it's enabled again. Its hosts keep trusting it, so the certificates it already signed keep working until they expire.

Delete

The CA stops issuing and is taken off its hosts. It stays restorable for 7 to 30 days, 30 unless you choose, in a Deleted section below the table, and is then removed for good with its keys. Deleting one that secrets issue from says so first.

Restore

From its row in the Deleted section. It comes back disabled and is put back on its hosts; enable it to issue again. Restoring is refused while another CA has its name.

Audit log#

Every change to a CA is recorded in your audit log, and each event can be sent to a webhook.

Event

Code

Severity

Certificate authorities listed

ca.list

Info

A CA's details opened

ca.view

Info

CA created

ca.create

Notice

CA renamed

ca.rename

Notice

CA disabled

ca.disable

Warning

CA enabled

ca.enable

Notice

Rotation settings changed

ca.rotation.policy

Notice

New key prepared, by a member or on the CA's rotation schedule

ca.rotation.prepare

Notice

Switched to the new key, by a member or after the switch delay

ca.rotation.activate

Notice

Waiting key removed

ca.rotation.cancel

Notice

Signing key replaced at once

ca.key.replace

Warning

An old key left the trust anchor, once everything it signed had expired

ca.key.remove

Notice

CA deleted

ca.delete

Warning

CA restored

ca.restore

Notice

Deleted CA removed for good with its keys

ca.purge

Notice

Nodes attached or detached, when the CA is created and on every change after

ca.nodes.change

Warning