SSH Resident Keys

Using SSH Resident Keys (FIDO2)

Prerequisites

  • YubiKey hardware token initialized with a PIN (most people set this up first).
  • A YubiKey FIDO2-compatible hardware token
  • OpenSSH 8.2+ (supports ed25519-sk keys).
  • ssh-keygen on Linux/macOS/Windows with WSL.

macos

On macos you will need to install openssh and ykman. You will also need to install libfido2 for FIDO2 support. Without the libfido2 package, you will not be able to use ssh-keygen -K to list/extract resident keys.

brew install openssh ykman libfido2

Commands

list passkeys and resident keys on yubikey (max 25 slots available)

ykman fido credentials list

delete ssh resident keys on yubikey

ykman fido credentials list
ykman fido credentials delete <Credential ID>

list ssh keys on ssh-agent

ssh-add -l

Generate Resident Key

Decide on your threat model

# No PIN or touch are required
ssh-keygen -t ed25519-sk -O resident -O no-touch-required
# PIN but no touch required
ssh-keygen -t ed25519-sk -O resident -O verify-required -O no-touch-required
# No PIN but touch is required
ssh-keygen -t ed25519-sk -O resident
# A PIN and a touch are required (most secure)
ssh-keygen -t ed25519-sk -O resident -O verify-required

(Optional) -O application=ssh:<identifier> when creating multiple keys

# no passphrase needed (PIN used instead)
ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:dohjon -C "yubikey-cat"
# see .ssh dir

Add keys

Ensure ssh-agent is started

ps aux | grep ssh-agent
# eval "$(ssh-agent -s)"

Add keys temporarily to ssh-agent

ssh-add -l
ssh-add -K
ssh-add -l

How to add keys on a new computer

Insert yubikey and cd to .ssh directory then run command to add resident ssh keys to new computer

cd ~/.ssh
ssh-keygen -K

Test connection to github

ssh -T [email protected]
# ssh -T -i ~/.ssh/id_ed25519_sk_rk_dohjon [email protected]

Tell GitHub to Use This SSH Key (Optional) If you have multiple SSH keys and want to make sure GitHub uses this specific one, you can configure it in your ~/.ssh/config.

Example ~/.ssh/config:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_sk_rk_dohjon
    IdentitiesOnly yes

Misc

Note!

id_ed25519_sk: means it's an SSH key (sk = security key) using the Ed25519 algorithm. rk: it's a resident key, stored in the hardware token. When using -O application=ssh:<identifier> it also adds the identifier last

id*ed25519_sk_rk_<identifier>

Copy the Public Key to the Remote Server

You need the public key (.pub file) in the ~/.ssh/authorized_keys file on any server you're trying to access.

ssh-copy-id -i ~/.ssh/id_ed25519_sk_rk_<something>.pub user@remote_host
# can be added manually as well
# cat ~/.ssh/id*ed25519_sk_rk*<something>.pub >>.ssh/authorized_keys