diff --git a/blog/yubikey-ssh-key-storage.markdown b/blog/yubikey-ssh-key-storage.markdown new file mode 100644 index 0000000..2ce7e93 --- /dev/null +++ b/blog/yubikey-ssh-key-storage.markdown @@ -0,0 +1,64 @@ +--- +title: How to Store an SSH Key on a Yubikey +date: 2022-05-27 +series: howto +tags: + - yubikey + - security +--- + +SSH keys suck. They are a file on the disk and you can easily move it to other +machines instead of storing them in hardware where they can't be exfiltrated. +Using a password to encrypt the private key is a viable option, but the UX for +that is hot garbage. It's allegedly the future, so surely we MUST have some way +to make this all better, right? + +\>implying there is a way to make anything +security related better + +Luckily, there is actually something we can do for this! As of [OpenSSH +8.2](https://www.openssh.com/releasenotes.html#8.2) (Feburary 14, 2020) you are +able to store an SSH private key on a yubikey! Here's how to do it. + +This should work on other FIDO keys like +Google's Titan, but we don't have access to one over here and as such haven't +tested it. Your mileage may vary. We are told that it works with the Google +Titan key that is handed out to Go contributors. + +First install `yubikey-manager` (see +[here](https://www.yubico.com/support/download/yubikey-manager/) for more +information, or run `nix-shell -p yubikey-manager` to run it without installing +it on NixOS), plug in your yubikey and run `ykman list`: + +```console +$ ykman list +YubiKey 5C NFC (5.4.3) [OTP+FIDO+CCID] Serial: 4206942069 +``` + +If you haven't set a PIN for the yubikey yet, follow +[this](https://docs.yubico.com/software/yubikey/tools/ykman/FIDO_Commands.html#ykman-fido-access-change-pin-options) +to set a PIN of your choice. Once you do this, you can generate a new SSH key +with the following command: + +``` +ssh-keygen -t ed25519-sk -O resident +``` + +If that fails, try `ecdsa-sk` +instead! Some hardware keys may not support storing the key on the key +itself. + +Then enter in a super secret password (such as the Tongues you received as a kid +when you were forced into learning the bible against your will) twice and then +add that key to your agent with `ssh-add -K`. Then you can list your keys with +`ssh-add -L`: + +```console +$ ssh-add -L +sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIKgGePSwpBuHUhrFCRLch9Usqi7L0fKtgTRnh6F/R+ruAAAABHNzaDo= cadey@shachi +``` + +Then you can copy this public key to GitHub or whatever and authenticate as +normal. The private key is stored on your yubikey directly and you can add it +with `ssh-add -K`. You can delete the ssh key stub at `~/.ssh/id_ed25519_sk` and +then your yubikey will be the only thing holding that key.