What this does
Generates a real SSH key pair — Ed25519 or RSA — entirely in your browser via the native Web Crypto API, and formats both halves exactly the way OpenSSH expects them: a single-line ssh-ed25519 AAAA... or ssh-rsa AAAA... public key for ~/.ssh/authorized_keys, and a private key file ready for ~/.ssh/id_ed25519 or ~/.ssh/id_rsa. Nothing is ever sent anywhere — verified against real ssh-keygen output (public key blob, comment handling, and SHA256 fingerprint all byte-for-byte identical) before shipping.
Ed25519 or RSA?
Ed25519 is the modern default OpenSSH itself recommends: a fixed-size 256-bit key with no size decision to make, faster to generate and to use than RSA at any comparable strength, and supported by every OpenSSH release since 2014 (6.5+). Reach for RSA only when you need to connect to something old enough to predate that — an ancient network appliance, a legacy CI runner, or a server whose SSH daemon was never upgraded. If you're not sure which a target system needs, try Ed25519 first; it works almost everywhere in 2026.
Why the private key formats differ
RSA's private key comes out as a plain PKCS8 PEM (-----BEGIN PRIVATE KEY-----) — the same format RSA Key Pair Generator produces, and one OpenSSH accepts natively with zero conversion. Ed25519 has no such shortcut: OpenSSH has never supported a standard PKCS8 container for it, so its private key is built as OpenSSH's own openssh-key-v1 binary container (-----BEGIN OPENSSH PRIVATE KEY-----) — unencrypted here, since there's no server to send a passphrase to and the file itself is the secret either way.
Setting it up
# Save the private key, then lock down its permissions — ssh-keygen and ssh
# both refuse to use a private key file that's readable by anyone else.
chmod 600 id_ed25519
# Add the public key to a server you want to log into:
cat id_ed25519.pub >> ~/.ssh/authorized_keys # (on the server)
# Or use ssh-copy-id from your own machine:
ssh-copy-id -i id_ed25519.pub user@serverWhat the fingerprint is for
The SHA256 fingerprint (matching ssh-keygen -l exactly) is a short hash of the public key — useful for confirming two copies of a key are actually the same one, or for comparing against a fingerprint a server shows you on first connection, without pasting the entire base64 blob to check.
Common mistakes
- Uploading the wrong file. Only the
.pubfile (the public key) goes intoauthorized_keysor a hosting provider's "SSH key" field. The private key never leaves your machine. - Loose file permissions. A private key file readable by other local users (or group/world-readable) is silently refused by OpenSSH —
chmod 600it after saving. - Losing the private key. This page never stores anything — closing the tab discards both keys permanently, and generating a new pair replaces whatever was here with no way to recover it. Save the private key before navigating away.
For how key authentication actually works under the hood, and how RSA, Ed25519, and ECDSA really compare, see SSH Keys Explained. Once you have a key, SSH Config Generator builds the ~/.ssh/config block that tells ssh which key to use for which host.
FAQ
Can I add a passphrase to the private key?
Not here — the key comes out unencrypted. Add one afterward with ssh-keygen -p -f id_ed25519, which re-encrypts the file in place without changing the key itself.
Does the comment matter?
Only as a label — it's not part of the key material. It shows up next to the key in authorized_keys and in ssh-keygen -l, which is useful once you have several keys and need to tell them apart at a glance.
Why does RSA need a key size but Ed25519 doesn't?
Ed25519 is defined as a single fixed curve and key size — that's part of its appeal. RSA's security depends on choosing a large enough modulus yourself; 3072-bit is a reasonable default in 2026, with 4096-bit for extra margin at the cost of slower key generation and slightly slower handshakes.
Try it yourself
Need a key pair for TLS instead of SSH login? See RSA Key Pair Generator or CSR Generator. Already have a key and want to check its type, fingerprint, or bit length instead of generating a new one? SSH Key Inspector reads any standard SSH public key.