FIDO2を使ってYubiKeyでSSH接続する

最近スマホを買いました。

BlackBerryに囚われているので物理キーボードが搭載されたスマホは買わなければいけないんです。

それはさておき、物理キーボードがついたスマホがあるとなると当然家のマシンにSSHしたくなるのが性。

スマホでssh-keygenで作った公開鍵をPCに追加するのも面倒ですし、せっかくなのでYubiKeyを活用したい。SSHに使えないかと思って調べてみると色々な方法があるらしい。

とりあえず一番新しそうなFIDO2でやってみます

TL;DR

公式のドキュメントを読みましょう

やっていく

FIDO2がサポートされていればYubiKeyじゃなくても良さそう。GoogleのTitanもFIDO2対応してた気がする。

OpenSSHのクライアントは8.3以降が良いらしい。Termuxで見てみたら OpenSSH_10.2p1 だったので大丈夫そう

YubiKey Managerというツールが別途YubiKeyのPIN設定に必要らしい。これは既に登録済みだったので割愛。

鍵生成

使えるのは

の2種。ここでは ed25519-sk にします。(YubiKeyのファームウェアが5.2.3以上である必要がある)

ssh-keygen -t ed25519-sk -O resident -O verify-required -C "your_email@example.com"

-O resident によりYubiKeyに鍵が保存され、YubiKeyだけで鍵の持ち運びができるっぽい。PINは必要だけど。

-O verify-required はPINとタッチの両方を求める。

生成時にもYubiKeyのタッチとPINの両方が求められる。それ以外は普段の鍵生成と同じ。

$ ssh-keygen -t ed25519-sk -O resident -O verify-required -C "comment"
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter PIN for authenticator:
Enter file in which to save the key (/home/lilium/.ssh/id_ed25519_sk):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lilium/.ssh/id_ed25519_sk
Your public key has been saved in /home/lilium/.ssh/id_ed25519_sk.pub
The key fingerprint is:

使用

部屋に転がっているmacに挿して使ってみます。

ssh-keygen -K でYubiKeyから鍵を取り出せるんですが、macでやる場合はデフォルトのssh-keygenではなくbrewなどで入れたバージョンを使う必要があります。

カレントディレクトリに吐き出されるので注意

$ ssh-keygen -K
Enter PIN for authenticator:
You may need to touch your authenticator to authorize key download.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Saved ED25519-SK key to id_ed25519_sk_rk

で、あとはこれを-iで指定するだけ。

Termux

さっきまでスマホで使う話をしていたのになぜ急にmacの話が出てきたのか。それはTermuxにまだlibfido2が来ていないからです…

まとめ

公式のドキュメント通りにし、libfido2があり、OpenSSHが新しめの環境であれば素直に使えることがわかりました。

この記事は🎄GMOぺパボ エンジニア Advent Calendar 2025の2日目の記事とします。

昨日は@yukyu30によるGoogle Workspace Flowsの実行結果をSlackに送信するでした。

あらゆる通知をどこか一つのアプリケーションにまとめたい気持ち、わかります。そういえばBlackBerry Hubというアプリは色々なメッセージ系アプリの通知をまとめられましたね…

明日は未定です。