はじめに
秘密鍵って、無防備なストレージに置きたくないですよね?
と言う事で、おはこんばんにちは(書いてるのは午前四時)
皆さんはSSHでサーバーに接続するとき、どんな認証を使用していますか?
まさかrootログインを許可した上でパスワード認証を使っていたりしませんよね?
冗談はさておき、多くの人は少なくともRSAやED25519などを使用した公開鍵認証を利用していることでしょう。
ではその秘密鍵、どうやって管理していますか?
カジュアルな運用を行っている自宅サーバーなど以外の真面目なサーバーは、恐らくはパスフレーズ付きの秘密鍵を使用しているのではないかと思います。
しかしその秘密鍵は通常、ローカルストレージ上に保管されます。
これでは、ランサムウェアによる暗号化や誤操作で失われるリスク、さらにはリモートから盗まれるリスクがあります。
そこで登場するのが、セキュリティキー(ハードウェアトークン)です。
たとえばYubiKeyなどのデバイスを使えば、秘密鍵を物理デバイスのセキュアエレメントの中に閉じ込めたまま、SSH認証を行うことができます。
秘密鍵はデバイス外に出すことができないため、たとえマルウェアに感染しても、秘密鍵を盗まれたり改ざんされたりすることはほぼ不可能です。
あと、ちょっとカッコいいです。
「秘密鍵をファイルに置いておきたくない」
「でもWindowsからSSHを安全に使いたい」
「セキュリティーキーってロマンがあってカッコいいよね」
という方にぴったりの内容です。
この記事では、Windows上でTera Termを使い、YubiKeyを利用してできるだけ簡単にSSHサーバーに公開鍵認証で接続する方法を紹介します。
必要なもの
YubiKey (PIV機能対応)YubiKey ManagerYubiKey PIV ToolYubiKey MiniDriverOpenSC-
TeraTerm5.5.0 -
PuTTY CAC0.83-1
※ 注意:
- これらは可能な限り最新バージョンを推奨します。
- PIV対応のYubiKeyの現在の正規代理店価格は大体1万円前後です。(円安って嫌だね)
- YubiKeyのファームウェアにより対応する鍵形式が異なります。可能な限り最新のファームウェアを搭載した製品を選んでください。
-
PuTTY CACはPuTTYをスマートカードなどに対応させたフォークです。
ダウンロードページ
インストール
インストール方法は基本的にそれぞれのインストーラに従って進めていくだけなので割愛します。
詳しく知りたい場合は他の人が書いた良質な記事があると思うので検索しましょう。
設定手順
ここからは、それぞれのソフトウェアのインストールが完了したという前提で進めます。
1. YubiKeyの準備と鍵ペアの生成
-
YubiKeyをUSBポートに接続します。しばらくすると自動的にデバイスドライバが適用されるはずです。
-
YubiKey Managerを起動しましょう。接続されたYubiKeyが無事に認識されていると製品情報(製品名、ファームウェアバージョン、シリアル番号など)が表示されるはずです。

-
YubiKeyファームウェアに関する注意:
- バージョン
5.4.xのYubiKeyは、対応している公開鍵アルゴリズムがRSA1024、RSA2048、ECCP256、ECCP384に限られます。さらに修正不能な脆弱性が存在するため、万一YubiKeyが盗まれた場合、資金力のある国家や大規模組織であれば困難ではありますが理論上鍵を取り出せる可能性があります。(私のYubiKeyは5.4.xです(涙)) - バージョン
5.7.xの人は喜びましょう。RSA4096やECDSA、ED25519に対応しています。
- バージョン
-
YubiKeyファームウェアに関する注意:
-
PIN ManagementメニューからConfigure PINsを押し、PINとPUKを変更します。

-
重要: YubiKeyは標準では
123456や12345678などの弱いPIN/PUKが設定されているので必ず変更しましょう。 - 補足: コマンドラインツールを使用するとPINの失敗許容回数を変更できますが、変更後にPINやPUKが初期値にリセットされるので、やりたい方は先に調べて設定しておきましょう。
-
重要: YubiKeyは標準では
-
PINの設定が終わったら左下の
Backを押して戻り、CertificatesメニューからConfigure Certificatesを押します。 -
Generateを押してキーペアを生成します。これらはYubiKeyのセキュアエレメント内で生成され、秘密鍵は一度もその外に出ることがありません。 -
Self-signed certificate(自己署名証明書)を選びNextを押します。 -
Algorithmでお好みのアルゴリズムを選びNextを押します。
例:5.4系ならRSA2048やECCP384、5.7系ならRSA4096やECDSAやED25519など。 -
Subjectには、SSH専用にするならスロットを判別しやすい名前(例:SSH_Auth_Keyなど)を付けておくと、他のスロットを使う時に識別がしやすくなります。 -
Expiration date(有効期限)を設定しますが、SSHの公開鍵認証に使うだけなら証明書の有効期限は関係ないので適当に設定してNextを押します。 -
最後に設定した項目が一覧で表示されるので、確認後に
Generateを押して先ほど設定したPINを入力します。 -
スロットが
No certificate loaded.から変わり、IssuerやSubject name、Expiration dateが見えていたら鍵の生成は完了です。

【重要】ここで一度YubiKeyを抜き差ししてください。
WindowsによってYubiKeyの証明書が証明書ストアの「個人証明書」に自動的にインポートされて後々便利です。
こんな感じで鍵マーク付きの証明書があればOK

余談: Slot 9aは、マイナンバーカードで言うところの「公的個人認証APの利用者証明用電子証明書」が入っている領域に相当します。一方、Slot 9cは「署名用電子証明書」の領域に相当します。
2. Pageant (SSHエージェント) の設定
次にPuTTY CACに付属するPageant(SSHエージェント)を操作していきます。
-
Pageantを起動すると、タスクトレイに常駐します。 -
アイコンをダブルクリックするか、右クリックしてコンテキストメニューから
View Keys & Certsを押すとPageant Key Listウィンドウが開かれます。

-
Add PKCS Certを押すとPlease Select PKCS #11 Library Fileというファイル選択ウィンドウが表示されます。 -
以下のどちらかの
dllファイルを指定してください。"C:\Program Files\OpenSC Project\OpenSC\pkcs11\opensc-pkcs11.dll""C:\Program Files\Yubico\Yubico PIV Tool\bin\libykcs11.dll"
-
タスクトレイのアイコンを右クリックして
Remember Certs & Keysにチェックを入れると、次回からPKCS#11ライブラリを指定する作業が不要になります。(※Windowsの個人証明書ストアへのインポートが済んでいる場合)
※インポートが済んでいる場合Add CAPI Certでも登録ができるようになります。
3. 公開鍵のサーバー登録
-
Pageant Key Listウィンドウで、使用する公開鍵を選択した後Copy To Clipboardを押します。 - Windowsのクリップボードにssh形式の公開鍵がコピーされるので、接続先サーバーの
~/.ssh/authorized_keysファイルに登録しておきます。
TeraTermでの接続
ここまでで準備は終了です。では実際に使っていきましょう。
-
TeraTermを起動し、通常の公開鍵認証と同じようにホストを指定後、サービスでSSHを選びOKを押します。 - SSH認証画面が表示されたら、ユーザー名を入れた後、認証方式に
Pageantを使うを選択してOKを押します。 - WindowsセキュリティのウィンドウでPINの入力を求められるので、入力して
OKを押すと自動的に公開鍵認証が行われてログインが完了します。
おまけ: FIDO2を使った認証
YubiKeyにはPIVの他に、Webのログインに使うFIDO2機能があります。
TeraTerm 5.5.0ではどれだけ試しても上手く動作しませんが、OpenSSH_for_Windows_9.8p2などの新しいOpenSSHなら、PageantとFIDO2を使用した公開鍵認証にも対応しています。
※もちろんPuTTYでもできます。
PuTTY CACやOpenSSH (ssh-keygen) からFIDO2の鍵をYubiKeyに生成した後、Pageant Key ListウィンドウからAdd FIDO Keyを選んでPageantに登録することで、PIVと同じような手順で利用可能です。
このとき、FIDO2の鍵には2つのタイプがあります。
-
Resident Key (Discoverable Credential)
- 鍵自体がYubiKeyのストレージ内に保管されます。
- これにより、YubiKeyをどのPCに接続しても、同じ鍵を利用できます。
-
ssh-keygenで生成する際のオプション:-O resident
-
Non-Resident Key (Non-Discoverable Credential)
- 秘密鍵はPCのローカルストレージ上に生成されます。
- YubiKeyは、その秘密鍵ファイルを利用するための「認証器」として機能します(秘密鍵の暗号化解除にYubiKeyのタッチが必要)。
- 鍵ファイル自体はPCに存在するため、別のPCで利用するには鍵ファイルをコピーする必要があります。
そして、OpenSSHでPageantを認証エージェントとして利用するには、OpenSSH側の設定ファイルに少し追記が必要です。
これは、Pageantに特定のコマンドラインオプションを付けて起動し、設定ファイルを出力させ、そのファイルをOpenSSHのconfigから読み込むことで実現します。
詳しい手順は、下記の公式マニュアルを参照してください。
openssh-config "C:\Users\ユーザー名.ssh\pageant.conf"

※ 補足: 未検証ですが、このOpenSSHを使った方法を設定しておけば、GitHubなどもセキュリティーキーを使用した公開鍵認証を使えるはずです。



