OpenBao SSH certificate authority: when static keys become the risk
Many teams discover their SSH exposure only when they try to answer a simple question: who can log in to which host, and with what key? Static keys accumulate in authorized_keys files, shared service accounts are reused across hosts, and removing a departing engineer often misses a key copied to a jump box or a build server. OpenBao's SSH secrets engine can act as a certificate authority that signs short-lived user and host certificates, or it can issue one-time passwords for logins. In both models, access expires on its own, and the trust decision moves from thousands of files to a small set of CA settings and policies.
This decision sits with platform, security and operations leads at regulated organizations, because it changes how every host authenticates and how access is granted and revoked. Platform teams own the host configuration that trusts the CA, security teams own the policy for certificate lifetimes, principals and which roles may request certificates, and operations teams own the runbooks for rotation and emergencies. DeployOpen plans and rolls out the CA inside your own infrastructure, including the OpenBao cluster that holds the signing material, the host trust configuration and the transition away from existing keys. Your team keeps custody of the environment and the decisions about who gets access.
OpenBao is licensed under MPL-2.0 and is developed by a community under open-governance principles. It is a Sandbox project of the Open Source Security Foundation under Linux Foundation stewardship, and it is a fork of Vault. Before design starts, confirm the SSH engine's exact modes, role options, certificate settings and host-side requirements against the current OpenBao documentation for the release you plan to run. These details change between releases, and a design built on memory of another product's behavior is a common source of rework. Ask the implementation team to record the release, the modes you will use and every setting that differs from the defaults.
Start with an inventory that answers three questions: which hosts accept static keys, which accounts are shared, and how a departing person's access is removed today. The answers shape the rollout order, since hosts with shared accounts and unmanaged keys usually gain the most from a certificate model. Plan for a new risk as well. The CA signing key and the roles allowed to request certificates become high-value targets, so they need their own access policy, audit logging and a recovery procedure that is tested before go-live. Ask for a written scope that names the hosts, the roles and the cutover approach before any work begins.
How signed SSH certificates and one-time passwords work
In this pattern, the SSH secrets engine acts as a certificate authority (CA). A user presents their public key to the CA, which returns a certificate for that key. The certificate carries a validity window and a list of allowed principals, which are the login names the holder may use on a host. Hosts are configured to trust the CA's public key, so they accept any valid certificate it signs instead of maintaining a list of individual user keys in each authorized_keys file.
The lifecycle has three stages. Issuance happens when a user or automation requests a certificate, usually after authenticating to OpenBao through an auth method. Expiry happens automatically when the validity window closes, so the certificate stops working without anyone revoking it. Short validity limits the damage of a stolen credential, because a copied certificate is useful only until it expires.
- Trust change: hosts trust one CA key instead of many user keys, so onboarding and offboarding happen at the CA.
- Validity window: a short window bounds how long a leaked certificate can be used.
- Principals: each certificate lists the logins it permits, so a certificate for one account cannot open another.
- Renewal: users or jobs request a new certificate when the old one expires, which keeps issuance under audit.
- Revocation: confirm with the docs how revocation of already-issued certificates is handled, since expiry is the main control.
Confirm the exact validity and option settings for your OpenBao version in the SSH secrets engine documentation before you set policy values.
The one-time password (OTP) mode issues a single-use credential for one target host. A user requests a password from OpenBao, receives it, and uses it once to log in to the named host. The credential is tied to that host and is consumed on use, so it cannot be reused for a second session. The host must be configured to accept OTP verification through the mechanism the SSH secrets engine documents for that setup.
The lifecycle is shorter than certificates. Issuance is per session and per host. The credential is valid only until it is used or until its short lifetime ends, whichever comes first. Because nothing long-lived is placed on the host, there is no key or certificate to rotate on each server. The trade-off is that every login depends on an OpenBao request, so the team must plan for availability and for users who connect from machines without access to the cluster.
- Single use: each credential works once, which removes replay of an intercepted password.
- Host binding: a credential is issued for a specific target, so it does not open other hosts.
- Per-session issuance: every access event creates a new credential that appears in OpenBao's logs.
- Dependency: logins require the OpenBao service to respond, so plan high availability first.
- Scope of use: OTP suits interactive administrative access better than unattended automation, which usually needs certificates.
Confirm the supported client setup, the lifetime settings and the host configuration steps in the current SSH secrets engine documentation for your version.
Host certificates reverse the trust direction. Instead of hosts trusting user keys, a client trusts a CA that signs each server's host key. When a user connects, the server presents its host certificate, and the client checks that the certificate was signed by a CA it trusts, that it has not expired, and that it names the host the user meant to reach. This lets the client verify that it is reaching the intended server rather than accepting whatever key appears on first contact.
The lifecycle mirrors user certificates. The OpenBao CA signs a server's host public key with a validity window and the host names it is valid for. The server presents this certificate in its SSH handshake, and clients that trust the CA accept it without a manual fingerprint check. When the window closes, the server needs a new certificate. This removes the common practice of accepting unknown host keys with a prompt that users often approve without checking.
- Client trust: clients hold one CA key for all servers, not a known_hosts entry per machine.
- Host names: the certificate lists the names the server may answer to, so a mismatched host is rejected.
- Rotation: host certificates expire, so renewal must be automated on every server.
- Rollout order: distribute the CA to clients before configuring servers, or logins will fail.
- Verification: test one host from a client that trusts the CA and one that does not, to confirm the check works.
Confirm the host certificate option names, the file locations on your operating system and the renewal approach in the OpenBao SSH documentation and your distribution's OpenSSH guidance.
Which SSH mode fits each access pattern
This table compares how signed user certificates, one-time passwords and signed host certificates from the OpenBao SSH secrets engine fit four common access patterns. Read each row against the operator work: sshd trust settings, helper software and how each login is recorded. The CA signing key is the most sensitive element of this design, so choose how it is generated or imported under your key management policy before any host trusts it.
| Access pattern | Signed user certificates | One-time passwords | Signed host certificates |
|---|---|---|---|
| Interactive administrator access | Short-lived certificates issued per session, with principals limiting which accounts each administrator can reach. Every target host must trust the CA. | Suits occasional break-glass access, but each login needs a helper on the host and an OpenBao request. Less practical for frequent admin sessions. | Does not authenticate administrators. It lets them verify the host they connect to against the CA. |
| Automation accounts | Workable if the job runner can request and renew certificates. Renewal logic and principal limits become part of the pipeline design. | Poor fit. Each login needs a person or prompt to supply the password, so unattended jobs cannot use it. | Not an authentication method for jobs. Clients use it to check the host that the job connects to. |
| Developer machines | Developers obtain a short-lived certificate after an OpenBao login. Hosts must trust the CA before this works. | Usable, though a helper on each host and an OpenBao call per login add friction to daily work. | Reduces host key prompts for developers, because clients validate hosts against the CA instead of stored known_hosts entries. |
| Legacy hosts that cannot change sshd | Not reachable without an sshd change, since sshd must trust the CA. Keep these hosts on a separate path or their existing keys. | Depends on PAM and sshd settings the host owner allows. Confirm these changes before planning this option. | Requires a host certificate in sshd, so it needs the same configuration change. Confirm what the host owner will permit. |
Setting up an OpenBao SSH certificate authority, step by step
This sequence builds a working SSH certificate authority on a non-production OpenBao cluster, from enabling the engine to proving that a test host accepts short-lived certificates and refuses them after expiry. Each step closes with a check so the team can confirm behavior before any production host trusts the CA. The result is a tested signing configuration and a documented trust path ready for review.
Enable the SSH secrets engine on a test cluster
The platform or security engineer enables the SSH secrets engine on a non-production OpenBao cluster that uses the same authentication setup planned for production. Use a cluster that no production host trusts, so mistakes in signing configuration cannot reach live systems. Confirm that the mount appears in the list of enabled engines and that the engine answers a read of its configuration. Take the exact enable command and mount path from the current SSH engine documentation for your OpenBao version, because CLI and API paths can change between releases.
Create or import the CA signing key
Under your key policy, generate the CA signing key inside OpenBao or import a key you already hold. Decide first who may create, rotate and read the key, and record that decision in your key management documentation. Confirm that the engine returns the public CA key, since that is the value hosts will trust in a later step, and that no read operation exposes the private key. Check the key type and signing algorithm against the current engine documentation and your own key standard. If you import a key, verify that its public half matches what you expect before any role depends on it.
Define signing roles with users and limits
Create one role per certificate type, for example one role for engineers reaching bastion hosts and another for automated jobs. For each role, list the allowed users and principals, set the default and maximum validity, and restrict certificate extensions and critical options to the ones a documented need requires. Agree the maximum validity with your incident response team, so a stolen certificate has a bounded window of use. Read each role back and confirm its fields match the design. Use the field names from the current documentation, since they vary by version.
Write policies that limit certificate requests
Write policies that let each identity request certificates only from the role it needs and only for the principals it is allowed to hold. Attach these policies to the auth methods your identity team already uses, such as OIDC or LDAP, so that group membership controls access. Test each policy with a token from every identity type. Confirm that an identity outside the intended group receives a permission error at the signing step, and that the intended identity succeeds. Keep a written record of which policy grants which role so auditors can trace each grant.
Configure a test host to trust the CA
On a test host, add the CA public key to the sshd configuration as a trusted user CA key, and point sshd at a principals mapping that ties each principal to a local account. Keep an existing SSH session open while you reload sshd, so a misconfiguration does not lock you out. Take the directive names and file locations from the documentation for your OpenSSH version. Confirm that the host accepts a certificate issued from the role and still rejects a plain public key that carries no certificate.
Issue a certificate and log in
Request a short-lived user certificate through the role, using an identity that the policy allows. Store the certificate next to the matching private key, then connect to the test host with both. Confirm that the login succeeds and that the host logs show the certificate was accepted. Record the serial number and validity window so you can match this certificate to audit entries later. If the login fails, check the principal list, the sshd logs and the validity window before you change the role.
Confirm refused login after expiry
Wait until a test certificate passes its validity window, or issue one with a deliberately short validity on a separate run, then attempt the login again. Confirm that sshd refuses it. Next, request a certificate for a principal outside the allowed list and confirm that signing fails. A login that succeeds after expiry means the host is not enforcing the certificate as expected, so stop and investigate before continuing. Document the results and the exact versions tested, then decide with your security team whether the configuration is ready for wider rollout.
Rolling the trusted CA out to hosts without lockouts
The rollout succeeds or fails on sequence, not on the signing configuration. Before any sshd change, inventory every host and every place a login is accepted: the authorized_keys files for each local account, the sshd configuration, bastion and jump host policies, and any automation that logs in with a key. Record which keys belong to people, which belong to service accounts and which have no known owner. Ask each team which hosts it logs in to and how, because this inventory defines the rollback surface for every later phase.
Next, mark the OpenBao SSH CA as trusted on a pilot group without removing anything. Trust is set with TrustedUserCAKeys in the sshd configuration, and access can be narrowed with principals through AuthorizedPrincipalsFile. Choose pilot hosts that are low risk and owned by a team that can test logins and respond quickly. Keep the existing static keys in place so both methods work during the transition. Run the sshd configuration test before every reload, and confirm on each operating system image that the SSH server supports the options you plan to use.
Keep a break-glass path throughout the transition. This should be an emergency access route that does not depend on the new CA or on OpenBao being reachable, such as a local administrator account whose credential is held offline under a documented approval process, or a console or out-of-band access path. Test it before the first host changes and retest after each wave. Also plan for an OpenBao outage during an incident: it blocks new certificate issuance, while certificates already issued remain valid until they expire. Confirm the lifetimes your signing roles will set, because they determine how long that exposure lasts.
Move one host class at a time, such as web servers, then application servers, then databases, with wave sizes set in the written scope. For each wave, change the configuration through your configuration management tool, reload sshd so existing sessions survive, then verify certificate logins for each identity group and confirm that automation still runs. Bastions need a specific decision: if they proxy sessions, determine whether the user certificate is presented to the bastion, the target or both, and test ProxyJump paths end to end. For service accounts, move each one to a dedicated machine identity or keep its key under separate review. Do not leave them for the final wave, where they are most likely to break unnoticed.
Remove static keys only after certificate logins are verified on every host in the wave. Set the exit criteria in advance: successful certificate logins on each host, an observation period agreed in the scope, audit records showing the expected identities, and no unowned keys left in the group. Then remove the authorized_keys entries through configuration management, keep a copy of each removed file, and log the change. Pace and group sizes depend on your estate, change windows and the number of teams involved, so the written scope should set them rather than a generic template.
Security controls that matter for an SSH CA
These controls decide whether a certificate authority improves SSH security or only moves the risk to a new place. Each card covers one design decision you make when configuring the SSH secrets engine in OpenBao and rolling the trusted CA out to hosts. Check every control against your own security policy before go-live, because the right values depend on your access model.
Signing key protection and access
The CA private key can sign certificates for every host that trusts it, so it is the most sensitive item in the design. Decide whether the key is generated inside OpenBao or imported, and where it is protected. Limit read and signing permissions to the engineers and automation that issue certificates. Dual approval for signing is a separate topic (control groups), and your policy should state whether it is required.
Short validity windows per role
A signed certificate stays valid until it expires, so the validity window is the main limit on how long a stolen certificate can be used. Set the TTL separately for each role, with shorter windows for privileged accounts and longer ones only where a documented need exists. Ask your security team which maximum lifetime your policy allows. Test automated renewal before go-live so short windows do not cause access outages.
Principal restrictions per role
A principal is the account name a certificate is allowed to log in as. Restrict each role to the specific principals its hosts and users need, so a certificate issued for one role cannot open a shared administrative account it was never meant to use. Review broad or wildcard principal lists during design. Confirm that the authorized principal settings on each host match the CA roles you defined.
Policy scoping per team
Each team should receive roles that cover only the hosts and accounts it owns. Map roles to your identity groups, and decide whether teams or customers need separate administration inside one cluster or separate clusters altogether. Confirm which people can create, change or delete roles, because a role change can widen access to every host that trusts the CA. The namespaces topic covers the design in more depth.
Audit logging of issuance and logins
Record every certificate issuance so you can later show who requested access and when. OpenBao logs requests to its API, but login attempts happen on the hosts, so you also need SSH logging on each host that trusts the CA. Decide where logs are stored, how long they are kept and who reviews them. OpenBao audit devices are a separate topic to plan with your logging team.
Revocation planning before go-live
Signed certificates remain valid until they expire, so removing access quickly depends on how your roles and hosts are set up. Confirm with the OpenBao documentation for your version which revocation options apply to SSH certificates. Plan the fallback in writing: short validity windows, role removal for departing users, and host-side deny settings for urgent cases. Test that procedure before go-live.
What changes for engineers, operators and auditors
For engineers, the largest change is that every connection starts with a request. Before logging in to a host, the engineer authenticates to OpenBao with the method the organization has chosen, such as Userpass for developer machines, and receives a signed SSH certificate that is valid for a short period. The SSH client presents that certificate, and the host accepts it because it trusts the CA. The long-lived private key that many people keep for years stops being the thing that grants access. Plan a short onboarding guide that shows the request command, explains what happens when a certificate expires during a session, and names who to contact when authentication fails.
For operators, revocation becomes a question of where issuance is controlled. Access is granted through the signing roles, the allowed principals and the policies that permit an identity to request them. Removing a person or group from those policies stops new certificates from being signed. The part operators must plan for is that a certificate already issued stays valid until its lifetime ends, unless the hosts also check revocation data. OpenSSH supports revoking certificates through revocation lists and related settings, so confirm with the host team how quickly an emergency removal must take effect and whether it needs a push to hosts.
Auditors receive a different kind of evidence. Instead of a spreadsheet of key files, owners and rotation dates, the record is the issuance history: which identity requested a certificate, when, for which principals and with what lifetime. That history exists only if audit devices are enabled and their output is retained and protected, so confirm the setup with the audit logging topic before relying on it. Auditors will also ask how the host trust configuration was approved and deployed, and how changes to roles and the CA are tracked in version control and change tickets. Prepare a sample trace that follows one access event from request to login so the auditor can see the full path.
Several friction points need a plan before rollout. Scripts that use a fixed key path, such as cron jobs, deployment tools and backup agents, will fail once the static key is retired, so inventory them and decide whether each one gets a certificate, a dedicated workload identity or another method. CI runners raise a similar question. A runner needs an identity that OpenBao can authenticate, and that identity should be scoped so a single job cannot request access to every host in the fleet. Test these paths in a non-production environment and record an owner for each one who signs off on the change.
On-call access during an OpenBao outage needs a deliberate answer. If OpenBao cannot issue certificates, engineers who already hold unexpired certificates can still connect until those expire, but nobody new can obtain access. Decide in advance whether a break-glass path exists, such as a separately held and monitored emergency credential or a documented procedure the security team has approved, and test it before it is needed. High availability and upgrades reduce how often this situation arises. Both are covered in the separate HA and upgrade topics, so use those to size the operational risk before committing to a design.
Limits to confirm in your environment before committing
An SSH certificate authority changes how every host trusts users, so the constraints that matter sit in your environment, not in the marketing. The cards below list what to verify with OpenBao documentation, your host inventory, your compliance owners and your key policy before you agree on scope.
SSH modes and options in the target release
Confirm which SSH secrets engine modes, certificate types and signing options the OpenBao release you plan to run documents as supported. Do not assume that a capability described for another release or for Vault applies to the version you deploy. Ask for the exact release notes and documentation for that version and record any option you need that is not listed.
OpenSSH and sshd versions per host class
Inventory the sshd and OpenSSH versions on each host class, including bastions, application servers, build runners and jump hosts. Certificate support and option handling differ between versions, so confirm that every class you intend to bring under the CA accepts the certificate types and options you plan to issue. Hosts that fail this check need a separate access path or a delayed rollout.
Legacy and appliance hosts
Identify network devices, storage appliances and vendor-managed systems that cannot be configured to trust a certificate authority at all. These hosts often accept only static public keys or local accounts. List them explicitly, decide whether they stay on static keys under a documented exception, and confirm the vendor's position in writing before you assume coverage.
CA key generation or import under your key policy
Decide how the signing key for the SSH certificate authority will be generated or imported, and who approves that step. Your key policy may require generation inside an approved hardware or external key store, a documented key ceremony or a specific key type. Confirm with OpenBao documentation which of these paths the release supports before you design the procedure.
Dependency on OpenBao for new sessions
Establish that new SSH sessions need a fresh signed certificate, so an OpenBao outage or a loss of network path to it can block new logins even when hosts are healthy. Confirm how your OpenBao high availability design handles this, what break-glass access exists and who can invoke it. Existing sessions and certificates already issued are a separate question that you should verify against the CA configuration you deploy.
Compliance acceptance of short-lived certificates
Ask your compliance owner and assessor whether short-lived certificates, signed on request and expiring on a set schedule, satisfy your access control and logging requirements in place of static key inventories. Confirm which evidence they expect, such as signing logs, approval records and host configuration. DeployOpen prepares that evidence, but acceptance is decided by your assessor, not by the implementation.
Questions buyers ask before an SSH CA rollout
What does an OpenBao SSH certificate authority rollout cost?
No price is published, and a quote follows from the written scope. Cost is driven by the number of hosts, how different those hosts are from each other (operating systems, sshd versions, bastions, appliances), the number of access patterns such as administrator, service and break-glass access, the change windows available for production hosts, and how far the CA must integrate with your existing identity provider and configuration management.
One-time work covers design, the CA key decision, engine and role configuration, host trust changes and cutover. Recurring work covers CA operations, key and policy review, and version upgrades, which can be taken on as a retainer. Ask each bidder to price these items separately and to state which hosts and access patterns are in scope.
How long does an SSH CA rollout take?
The timeline depends mainly on estate size, approval cycles and the length of the pilot, and the written scope is where the agreed dates are fixed. A small, uniform estate moves faster than a mixed one because each host class needs its own trust change and test. Approval cycles matter because change advisory or security sign-off often gates each change window, so a missed window can add a full cycle. The pilot should run long enough to observe certificate issuance, renewal, expiry and logging under normal use. Ask for a phased plan with milestones and the dependencies each one waits on, and confirm your own change calendar before agreeing dates.
What does my team need to provide for an SSH CA rollout?
Your team needs named owners, host access, change windows and a decision on the CA key policy before work starts. Name one owner for the CA and its policies, one owner for host access, and one approver for production changes, and make sure they can decide without waiting on a committee for every step. Provide administrative access to a representative host set and to every host in the pilot, with a way to reach them if sshd configuration breaks. Reserve change windows in advance.
The CA key policy decision covers where the signing key lives, who can request signatures, and how the key is rotated and recovered. Record these decisions in the written scope so they are not discovered mid-project.
Can our team roll out an OpenBao SSH CA without a partner?
Yes, a team can do it alone when the estate is small and the team already has strong SSH and OpenBao skills. The work is configuration-heavy but not large in itself. The main risk is lockout: a faulty sshd trust change or a CA misconfiguration can stop administrators from logging in, and recovery may require console or out-of-band access. Before starting, confirm that break-glass access exists on every host class and that it has been tested. A partner adds the most value where the estate is mixed, change windows are tight, or the team has not run this rollout before. An independent review of the design is a reasonable option even for a capable internal team.
What causes SSH lockouts during a certificate authority rollout?
Lockouts usually come from changing host trust before the new certificate path is proven, from a wrong principal or option in a role, or from a broken configuration pushed to many hosts at once.
Common causes:
- Trusting the CA on production hosts before a pilot host has accepted a signed certificate
- Role templates that allow the wrong principals or omit intended restrictions
- Configuration management applying a sshd change to a whole host group in one run
Mitigations include keeping an existing key-based path open until the new path is verified, staging changes per host class, and testing recovery from console access. Confirm the recovery steps with your own platform team, including who holds the console credentials.
Does DeployOpen handle SSH CA design and rollout for us?
DeployOpen plans, implements, hardens and documents self-hosted open-source platforms in infrastructure you control, and an SSH CA rollout falls within that work when it is written into the scope. Most engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts. The written scope should name the hosts, access patterns, identity and configuration integrations, the pilot, the cutover and the handover. After go-live, ongoing support, upgrades and testing can be taken on as a retainer. DeployOpen prepares controls and evidence for compliance assessments but does not issue audit reports or certifications, so evidence gathered during the rollout goes to your independent auditor.
How DeployOpen scopes and delivers an SSH certificate authority
DeployOpen plans and implements OpenBao's SSH secrets engine inside infrastructure you control, so engineers receive short-lived signed certificates or one-time passwords instead of long-lived static keys. Engagements are fixed-scope, with the scope, deliverables and timelines agreed in writing before work starts.
How we scope
- We inventory how SSH access works today, including static keys, bastions, hosts and service accounts that need access.
- The written scope names which OpenBao SSH features are in use, such as signed certificates or one-time passwords.
- We agree which hosts, environments and auth methods the CA will serve before any configuration starts.
How we build
- We deploy or configure the OpenBao cluster the SSH engine runs on, using the storage and HA design agreed in scope.
- We enable the SSH secrets engine, create signing roles with TTLs and principals, and wire identity into signing requests.
- We test certificate issuance, expiry, revocation and host trust in a non-production environment before rollout.
How we hand over
- We roll the trusted CA public key out to hosts and document the sshd configuration applied on each host class.
- We document the signing roles, policies, principal mappings and the runbook for rotating the CA key.
- We walk your team through the operating procedures so they can issue, audit and retire access without us.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer after handover.
- We can plan OpenBao version upgrades against the release notes and test the SSH engine before each change.
- We confirm any remaining static key paths are retired on a schedule your security team approves.

