When it comes to secure shell (SSH) authentication, there is a widespread consensus that SSH certificates hold an edge over SSH keys (though SSH keys are currently more widely used). SSH keys are easy to provision, but are hard to distribute and invalidate. SSH certificates, on the other hand, are easier to use and audit, but harder to provision. Happily, Platform.sh has made provisioning certificates easier for our users. At Platform.sh, we use Secure Shell (SSH) certificates to authenticate users into their applications’ servers. We rely on a service named “Certifier” to provide the certificates. Certifier is, in essence, pretty simple:Documentation Index
Fetch the complete documentation index at: https://developer.upsun.com/llms.txt
Use this file to discover all available pages before exploring further.
- It exposes an endpoint with the list of the certificate authority’s public keys.
- It exposes an endpoint that you can POST to with a public ssh key and then returns an SSH certificate that is valid for one hour.
~/.ssh/config file, such as:
platform ssh-cert:load command is fetching a new SSH certificate.
Effectively, this lets us provide a mostly transparent workflow. Our customers run their SSH commands, and Certifier
automatically grabs a new SSH certificate every time one is needed. Given that each certificate is only valid for one
hour, if a customer needs to offboard a user, we just need to ensure that Certifier is no longer delivering certificates
to that user.
Speaking of which, how does Certifier authenticate that user? It’s obviously not just blindly returning SSH certificates
to whomever is asking for one. Certifier is relying on one of the most prominent authentication technologies on the web:
OAuth2.
When a Platform.sh customer logs in or tries to SSH, they’re effectively fetching an SSH certificate while passing along
an OAuth access token that they previously obtained from our Authentication service.
Certifier uses that token to get information about the customer from the OAuth token introspection
endpoint (https://auth.api.platform.sh/oauth2/tokens).
As an example, this is what the introspection endpoint can return:
- The Universally Unique Identifier (UUID) of the user
- Whether and when the user used Multi-Factor Authentication (MFA) when logging in
- Periodically fetch the certificate authority’s certificates.
- Verify an SSH certificate coming in, trusting the metadata, such as the user’s UUID, that is in the certificate.
- The region for which the certificate was requested. If the edge layer is not on the given region, it can reject it.
- The support ticket for which the certificate was requested. The edge layer can then log it to have thorough auditing.
- There’s no need to maintain any certificate revocation lists.
- There’s no need to rely on users rotating their credentials.
- You can use your usual Single Sign On-based OAuth servers for authentication.
- You can embed a ton of authentication/authorization related metadata.