🐔

Windows の SSH で gpg-agent を使う

2021/08/09に公開
2

背景

最近は(昔から?)猫も杓子も GPG を使うのが流行りらしいし(ミーハー)、GPG では SSH のキーも管理できるっぽいのでちょっと流行りに乗って使い始めてみることにした。
そして折角なので忘備のためにメモを残しておく。

なお、当方 GPG も暗号もセキュリティも初心者なので、マズい事が書かれていたらツッコミを入れて欲しい。

Gpg4win のインストール

さっそく Gpg4win を公式サイトからダウンロードしてインストールする。現在の最新版は 3.1.16 らしい。
何かコンポーネント選択画面が出るが、とりあえず全部入りにしとけば困らんだろうと思い全部チェックを付けてインストール。
そのまま進むと Kleopatra なるアプリが起動する。何だこれ?

良く分からないがどうも GUI のフロントエンド的なモノっぽい。(雑

プライマリキーペアの生成

まぁ何はなくともプライマリキーを生成しないといかんようなので New Key Pair を押して生成する。

「名前」は後々ユーザ ID として使用するので指定しておこう。あと、プライマリキーは非常に重要なものらしいのでパスフレーズも設定しておこう。てか何か日本語英語入り乱れてキモいな…。まぁいいや。
で、意識他界系としては詳細設定も押したくなる。

イマドキは楕円曲線暗号系が流行りらしいので(ミーハー)、ECDSA/EdDSA を選択してみるとイロイロあるが良く分からんし NIST の暗号は信用置けない(偏見)しネットで良く ed25519 を見かける気がするので ed25519 にしておいた。

が、下の + ECDH のチェックと更に下の「証明書の使用目的」と言うのが良く分からん。いや ECDH のチェックと下の「暗号化」のチェックが連動するのはまぁ分かるんだが(鍵交換できないと暗号化できないって事だよね?)、署名とか保証とか認証って何だよ。公開鍵暗号の利用方法って暗号化と電子署名の 2 つじゃないのかよ。

仕方なくイロイロ調べてみると、GPG では(OpenPGP では、かな?)キーの使い道として「暗号化」の他に「署名」、「認証」、「保証」の 3 種類が定められているらしい。

  • 署名(Sign)
    いわゆる普通の署名。このキーは、ファイルとかに署名して「これは確かにオレが書いたよ」的なヤツとして使う、と言う理解でよいのかな?(より正確にはオレが信じて送り出した内容から改竄されてないよ、か?)
  • 認証(Authenticate)
    ログインに使うヤツ。今回まずやりたかったのはこれ。このキーは、ログイン時の認証に使うよ、と言う感じか?
  • 保証(Certificate)
    キーに対する署名。これが最初良く分からなかった。GPG では人からもらったキーに対してプライマリキーで署名できるらしいのだが(このキーは信用したぜ、的な感じか?)、その役割がこれのようだ(あってる?)。これはプライマリキーのみに許された役割なので、選択の余地はない。てか Certificate って「保証」なんか?まぁいいか。

と言うわけで、良く分からないのでデフォルトでもいいが、プライマリキー生成だし折角なので(?)全部そぎ落として「保証」だけにした上で有効期限も無しにしてみた。つまり、プライマリキーは人からもらったキーの「保証」にしか使わない、と言うことだ。

で、OK のあと create を押すと以下のようなダイアログが出てパスフレーズを聞かれる。

パスフレーズを入力すると無事にプライマリキーができる

とりあえずは使ってみたいのでバックアップは無しで良しとしよう(ちゃんとバックアップしろよ…)。メール送信とかキーサーバへのアップロードはもってのほかだ。

なお、普通はここであらかじめ失効証明書も作成しておいて、秘密鍵の流出やパスフレーズ忘却に備えておくものらしい。が、実はこれは勝手に実行されているっぽい。フォルダ %APPDATA%\gnupg\openpgp-revocs.d を覗いてみると 5D5A946A0C5848853742A0CC37C6E17F714D3549.rev なるファイルが出来ていた。ファイル名部分は先程作成したキーの指紋(fingerprint)だ。

ちなみに、コマンドラインからやる場合には gpg --expert --full-generate-key を使う。

C:\Users\kariy>gpg --expert --full-generate-key
gpg (GnuPG) 2.2.28; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (7) DSA (機能をあなた自身で設定)
   (8) RSA (機能をあなた自身で設定)
   (9) ECC と ECC
  (10) ECC (署名のみ)
  (11) ECC (機能をあなた自身で設定)
  (13) 既存の鍵
  (14) カードに存在する鍵
あなたの選択は? 11

鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate
現在の認められた操作: Sign Certify

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? s

鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate
現在の認められた操作: Certify

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? q
ご希望の楕円曲線を選択してください:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
あなたの選択は? 1
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
鍵は無期限です
これで正しいですか? (y/N) y

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: Mitsuru Kariya
電子メール・アドレス: xxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxx
コメント:
次のユーザIDを選択しました:
    "Mitsuru Kariya <xxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxx>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。

途中、唐突にパスフレーズを設定しろとのダイアログが出る。デフォルトはそこ GUI なのか…

てか pinentry-qt って事はあの Qt か?よくよく見てみれば上記の GUI からプライマリキーを作成した時のダイアログも pinentry-qt だな。確かにヘルプから Kleopatra についてを選んで表示される About Kleopatra でライブラリタブを見ると Qt って書いてある。

話がそれた。パスフレーズを設定してやると、続きが実行される。

gpg: 鍵37C6E17F714D3549を究極的に信用するよう記録しました
gpg: 失効証明書を 'C:/Users/kariy/AppData/Roaming/gnupg/openpgp-revocs.d\5D5A946A0C5848853742A0CC37C6E17F714D3549.rev'  に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   ed25519 2021-08-09 [C]
      5D5A946A0C5848853742A0CC37C6E17F714D3549
uid                      Mitsuru Kariya <xxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxx>

これでコマンドラインでプライマリキーペアを作成できた。
おっ、こっちではちゃんと失効証明書を作ったよと出てるな。

あ、ちなみに、上記ではコマンドの結果が日本語で出力されているが、実はこれが安定しない。日本語で出たり英語で出たり、何なら日本語で出てる風なんだが化けらっただったりする。ようわからん。現状では少なくとも gpg コマンドを同一コマンドプロンプトから 2 回以上起動すると 2 回目から英語で出てる気がする。気のせいかもしれないが。

サブキーペアの追加

ようやくプライマリキーペアができたので、続いて認証のためのサブキーペアの生成をする。なお、既に SSH で使っているキーを再利用するのであればこの手順は必要ない(SSH で使っているキーをサブキーとして再利用するケースについては別記事「ssh の既存の秘密鍵を gpg にインポートする」に書いたので参照して欲しい)。

そう言えば、「プライマリキーは秘密鍵、サブキーは公開鍵」的な事を書いてある記事を見かけた気がする。そんなわけあるか。プライマリキーもサブキーもどちらも秘密鍵と公開鍵のペアだ。いや、そんなアホな記事を見かけたって言うのが夢だったのかもしれない。

話がそれた。サブキーペアの生成だが、Kleopatra のどこを探してもサブキーの追加できそうな所が無い。仕方なくイロイロ調べてみると、どうも Kleopatra ではサブキーの追加は出来ないらしい。何でだよ!
ついでに言うと、Gpg4win には Kleopatra の他に GPA なる GUI アプリも付いているのだが、こちらでもサブキーの追加は出来ないらしい。仕方がないのでコマンドラインでポチポチやることにする。

コマンドプロンプトで gpg--edit-key モードで起動する。引数はユーザ ID(プライマリキー生成の時に指定した「名前」)だ。この時、--expert も付けておかないと生成するサブキーの役割選択ができない上に流行りの楕円曲線暗号系も使えないので注意が必要だ。

C:\Users\kariy>gpg --expert --edit-key "Mitsuru Kariya"
gpg (GnuPG) 2.2.28; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  ed25519/37C6E17F714D3549
     created: 2021-08-08  expires: never       usage: C
     trust: ultimate      validity: ultimate
[ultimate] (1). Mitsuru Kariya <xxxxxxxxxxxxxxx@xxxxxxxxxxxxxx>

gpg>

続いて addkey コマンドを叩くとやりたいことを選べと言われるので当然流行りの ECC ジュニアを選ぶ。ちなみに ECC と言う選択肢は 3 つあるが、ここで使うのは役割を選べる 11 だ。

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
  (14) Existing key from card
Your selection? 11

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Sign

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection?

すると、初期状態では Current allowed actionsSign のみ、つまり署名だけが出来る状態になっているので、SA で状態を反転して Authenticate だけが出来る状態に変更する。

Your selection? s

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions:

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? a

Possible actions for a ECDSA/EdDSA key: Sign Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection?

無事 Current allowed actionsAuthenticate だけになったので、Q で終了するとアルゴリズムとパラメータの選択になる。どれでもいいんだが今回もプライマリキーと同じく Curve 25519 を選んでみた。

Your selection? q
Please select which elliptic curve you want:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
Your selection? 1
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)

で、今度は有効期限を聞かれるが、面倒なのでデフォルトの 0、つまり無期限を選択した。

Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y

で、最後にしつこいぐらいに「ええんか?ホントにええんか?」と聞かれるのではいはいと答えるとここでも唐突にプライマリキーのパスフレーズ入力を促すダイアログが出る。

正しいパスフレーズを入力すると無事に認証用のサブキーが出来る。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  ed25519/37C6E17F714D3549
     created: 2021-08-08  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  ed25519/DADC6910610315D7
     created: 2021-08-08  expires: never       usage: A
[ultimate] (1). Mitsuru Kariya <xxxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxx>

gpg>

ちなみにぼ~っとしてパスフレーズ入力ダイアログを放っておくとタイムアウトエラーになって addkey の最初からやり直しになるので注意。
最後に quitgpg から抜けるのだが、この時に「保存する?」と聞かれるのでちゃんと y を答えて保存しよう。

gpg> quit
Save changes? (y/N) y

これでようやく ssh で認証するためのサブキーが生成できた。

そう言えば、今回は英語で出てるな…

サブキーペアの確認

念のため Kleopatra でサブキーペアを確認してみよう。
上のでっかいツールバー的なところで Certificates を選択すると(デフォルトはここが表示されている)下にプライマリキーペアが表示されるので、そのキーをダブルクリックすると…

Certificates Details ダイアログが表示される。

ここで 左下にある More Details… ボタンをクリックするとサブキーの一覧が表示される。

ここでは上の行がプライマリキーで(Primary にチェックが付いてる) Usage(役割)は Certify(保証)、下の行は UsageAuthenticate(認証)になっている。オーケーだ。

ちなみに、コマンド gpg -k でコマンドラインからも確認することができる。

C:\Users\kariy>gpg -k --with-subkey
C:/Users/kariy/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
pub   ed25519 2021-08-08 [C]
      5D5A946A0C5848853742A0CC37C6E17F714D3549
uid           [ultimate] Mitsuru Kariya <xxxxxxxxxxxxxx@xxxxxxxxxxxxx>
sub   ed25519 2021-08-08 [A]
      175849D70CEF1ED17FD03672DADC6910610315D7

pub で始まっているのがプライマリキー、sub で始まっているのがサブキーだ。ここでは --with-subkey も指定したのでそれぞれのキーに指紋(fingerprint)が表示されている。
pub のキー(プライマリキー)には右側に [C] と出ている。つまり Certificate(保証)の役割で使用可能なキーだ。
sub のキーの右側には [A] とある。つまりこのサブキーは認証用に使用可能と言う事だ。

サーバへの SSH 公開鍵の登録

さて、SSH で作ったキーを使うためには公開鍵をサーバの ~/.ssh/authorized_keys に追加しなければならない。追加する内容は、上のサブキーペアの確認で出たダイアログで確認できる。
Authenticate の付いたサブキーを右クリックするとコンテキストメニューが出てくる。

ところで、何で Context はコンテキストだし Text はテキストなのに Next はネクストなんだろうか、ネキストが正しいんじゃないのか?Dr.パソコンかよ。

話がそれた。このメニューから Export OpenSSH key を選択すると、以下のようなウィンドウが表示される。

コイツを、何とかしてサーバの authorized_keys に追加すれば、サーバ側の準備は完了だ。
なお、当たり前だが authorized_keys のパーミッションには気を付ける必要がある。オレはいつも 400 にしている。400 じゃないとダメなんだっけ?(無知)

ちなみに、コマンド gpg --export-ssh-key を使用しても authorized_keys にそのまま追加できるものが表示される。これも引数はユーザ ID(プライマリキー生成の時に指定した「名前」)だ。

C:\Users\kariy>gpg --export-ssh-key "Mitsuru Kariya"
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILEuINVllRVRnXticnq2GjlEdvC1G4XCLB6BvUE4iTsu openpgp:0x610315D7

もちろん表示される内容は先程のモノと同一だ(そうじゃないと困る)。

gpg-agent への秘密鍵の登録

実際に SSH する際には当然秘密鍵が必要になるわけだが、使うたびにくっそ長いパスフレーズを入力するのは面倒なので ssh-agentpageant のようなエージェントを使用して一回パスフレーズを入力したらしばらく秘密鍵を保持しておいてもらうことになるだろう。

ところで pageant について「PuTTY の agent なんだから pagent なんじゃないのか?スペルミスか?」的な事を書いてある記事を見かけた気がするが、敢えて英単語の「ページェント」に掛けているのではないか思う。個人的には pagent の方がググラビリティが高くなりそうなので良い気もするのだが…

話がそれた。Gpg4win に含まれている gpg-agent も GPG の秘密鍵を保持してくれるエージェントなのだが、その保持している秘密鍵を SSH の認証に使うにはあらかじめどの秘密鍵を SSH の認証に使って良いかを gpg-agent に知らせておく必要があるようだ。
で、ここでもまたコマンドラインのお世話になる。(いや、実は GUI だけで出来たりするのかもしれないが、オレには良い方法が見つけられなかった)

まず、コマンド gpg -k --with-keygrip で SSH に使用する秘密鍵の keygrip なるモノを入手する。

C:\Users\kariy>gpg -k --with-keygrip
C:/Users/kariy/AppData/Roaming/gnupg/pubring.kbx
------------------------------------------------
pub   ed25519 2021-08-08 [C]
      5D5A946A0C5848853742A0CC37C6E17F714D3549
      Keygrip = 71A9E9451BD11D9E5C01BCB18F8110565636A160
uid           [ultimate] Mitsuru Kariya <xxxxxxxxxxxxxx@xxxxxxxxxxxxx>
sub   ed25519 2021-08-08 [A]
      Keygrip = E8C3EFAA0F2CBBD8CDF78FE7D03567AD45CA237D

ここでは下の [A] とあるのが認証用のキーなので、そいつの keygrip は直下に表示されている E8C3EFAA0F2CBBD8CDF78FE7D03567AD45CA237D だ。
ちなみに、-k は公開鍵の一覧を表示するコマンドで、keygrip も公開鍵を識別するモノらしいのだが、公開鍵の keygrip を指定すると対応する秘密鍵を指定したことになるっぽい。(厳密な話は分かっていない)

で、こいつをどうするかと言うと %APPDATA%\gnupg\sshcontrol と言うファイルに追加する必要があるのだ。ファイルの最後にでも一行追加しておけばよい。
大した編集ではないので編集に使うのはメモ帳でも何でもよい。ちなみにメモ帳ならファイルを開く際のダイアログに直接 %APPDATA%\gnupg\sshcontrol と入力すれば当該ファイルを開く事ができる。メモ帳も捨てたもんじゃない。

ちなみに、ファイルのコメントにもある通り keygrip の後ろに続けてスペースで区切って数値を書くと、それが秘密鍵をキャッシュしている時間になる。単位は秒。ゼロだと無期限かな?この「時間」と言うのは当該キーにアクセスしてからの経過時間のようだ。つまり、そのキーで認証するたびに経過時間はリセットされることになる。

では時間を書かなかったらどうなるかと言うと、デフォルト値になる。で、じゃあデフォルト値は何なんだよと言うと、Kleopatra から設定できる。
Kleopatra の「設定」メニューから「Kleopatra を設定(C)…」を選ぶと設定ダイアログが出る。このダイアログの左側から「GnuPG System」を選択した上で、右側で「プライベート鍵」タブを選ぶと、下記のような画面になる。

ここの「N秒後にSSH鍵を無効にする」がデフォルト値で、設定を変更していなければ 1800 になっているはずだ(つまり 30 分)。

ところで、この設定とは別に「最大SSH鍵存続時間をN秒とする」と言うのも見えると思う(デフォルト値は 7200 秒、つまり 2 時間)。これは、どのSSH鍵もここで設定した時間以上は絶対に保持し続けない、と言う事らしい。つまり、たとえ直前に認証したとしても、最初にそのキーを使ってからここで指定した時間以上は絶対に保持し続けない、と言う事だ。
なお、これらの設定は %APPDATA%\gnupg\gpg-agent.conf と言うファイルに保存される。それぞれ default-cache-ttl-sshmax-cache-ttl-ssh と言う設定だ。

話がそれた。最後に、この変更を gpg-agent に認識させる必要があるので、gpgconf --reload コマンドを実行する。

C:\Users\kariy>gpgconf --reload

ちなみに Windows へログオンしてから一度も Kleopatra 等を起動していない場合には gpg-agent が起動していない。
その場合には、gpg-connect-agent /bye と実行すると起動する。このコマンドを実行するショートカットをスタートアップフォルダに入れておくのも良いかもしれない。
もちろん、Kleopatra を起動すれば gpg-agent も勝手に起動するので、Kleopatra を自動で起動するようにしても構わない。

書き忘れていたが、Kleopatra は普通にウィンドウを閉じただけだと、↓なアイコンがタスクトレイに残っている。

ホントに終了させたかったら「ファイル」メニューの「終了(Q)」を選ぶか、タスクトレイの Kleopatra のアイコン右クリックから「Kleopatra を終了(S)」を選ぶ必要がある。
なお、Kleopatra をホントに終了させても gpg-agent は終了しない。gpg-agent を終了させたければ、コマンドラインから gpg-connect-agent killagent /bye と打つ。

SSH からの使用(PuTTY)

gpg-agent に秘密鍵を指定する所までできた。いよいよ SSH の起動だ。Windows で SSH と言えば PuTTY だろう(個人の感想です)。と言うわけで PuTTY で gpg-agent を使う準備をする。

gpg-agent には PuTTY の pageant 互換の機能があるのでこれを有効にする事で、PuTTY から GPG のキーを利用できるようになる。

設定は極めて簡単だ。Kleopatra の「設定」メニューから「Kleopatra を設定(C)…」を選ぶと設定ダイアログが出る。このダイアログの左側から「GnuPG System」を選択した上で、右側で「プライベート鍵」タブを選ぶと、下の方に「Puttyサポートを有効にする」と言うのがあるので、これにチェックを付けてから OK を押して設定を保存すればよい。

今回もこの変更を gpg-agent に認識させる必要があるので、gpgconf --reload コマンドを実行する。

C:\Users\kariy>gpgconf --reload

この後、いつも通り PuTTY からサーバに接続すれば、例によって唐突にプライマリキーのパスフレーズを入力するためのダイアログが出るので正しく入力する。

これでつながった。

SSH からの使用(Windows 標準の SSH)

どうも最近(?)では Windows に標準で OpenSSH が搭載されているようだ。縁起物なのでこいつでも使えるようにしよう。

上の pageant 互換機能の設定で気付いたかもしれないが「Ssh サポートを有効にする」と言うのがある。
が、騙されてはいけない。このチェックボックスはワナだ。このチェックを付けても使えるようになる SSH クライアントなどどこにもない(当社調べ)。

神記事「混沌を極めるWindowsのssh-agent事情」を見て頂くと分かるが、Windows における SSH と SSH-AGENT との通信は複数の亜種がある。正確に言うと通信の中身としては pageant とそれ以外の ssh-agent の二種類しかないのだが(実はこれ以外にもあるのかもしれないが、それは置いておくとして) 一種類しかないのだが(コメントで pageantssh-agent も通信の中身は同じであると教えて頂きました!)、ssh-agent の通信チャネルが元々 UNIX ドメインソケットであるために、その Windows へのポーティングが複数種類できてしまっていて、異なる種類の間では直接通信ができないのだ。

で、GPG はどの SSH 実装が使用しているポーティングとも異なる libassuan なる GPG のためのポーティングを使用しているため、誰とも会話が出来ないのだ。

じゃあどうすればいいかと言うと、これも神記事「混沌を極めるWindowsのssh-agent事情」を読めば一発解決である。上記のように gpg-agent でも pageant 互換機能は正しく使用できているので、記事にある wsl-ssh-pageant を使用すればよいのだ。

と言うわけで、wsl-ssh-pageantReleases からダウンロードする。現在の最新版は 20201121.2 のようだ。CUI 版と GUI 版があるので好きな方にすれば良いが、スタートアップから起動するのであれば黒いのが鬱陶しいので GUI 版が良いだろう。(ウチの環境は 64 bit なので wsl-ssh-pageant-amd64-gui.exe

起動オプションは wsl-ssh-pageant-amd64-gui.exe --systray -winssh openssh-ssh-agent で良い。
一応オプションを説明しておくと、

  • --systray
    タスクトレイにアイコンを出すオプション。特に GUI 版だとこれが無いと動いてるんだか動いてないんだか分からない。
  • -winssh openssh-ssh-agent
    Windows 標準の SSH 向けのモードで起動するオプション。openssh-ssh-agent の部分は名前付きパイプの名前部分で、この指定の場合名前付きパイプの名前は \\pipe\.\openssh-ssh-agent になる。他の名前でもいいっちゃあいいのだが、Windows 標準の SSH ではデフォルトの名前が \\pipe\.\openssh-ssh-agent なので、この指定であれば SSH_AUTH_SOCK 環境変数を設定しなくてもうまく通信できるようになる。特にこだわりが無ければこの名前が良いだろう。

ちなみに、ダウンロード後初回起動時には以下のようなダイアログが出た。

正しくダウンロードできていると確信できるのであれば慌てず「詳細情報」をクリックして以下のような表示になったら「実行」をクリックすればよい。

正常に起動できれば↓なアイコンがタスクトレイに現れる。

この後、コマンドラインから SSH を使用してサーバに接続すれば、例によって唐突にプライマリキーのパスフレーズを入力するためのダイアログが出るので正しく入力する。

これでつながった。

終わりに

何か Windows の SSH で gpg-agent を使うためだけに大層な事になった気がしないでもないが、気のせいだろう。それに、これでファイルの暗号化や署名なども行える土台が整ったのだ。

なお、今回は PuTTY と Windows 標準の SSH だけを取り上げたが、神記事「混沌を極めるWindowsのssh-agent事情」を参照してもらえれば他の SSH クライアントを使用することも容易に実現可能だ。

Discussion

IWAMOTO KouichiIWAMOTO Kouichi

正確に言うと通信の中身としては pageant とそれ以外の ssh-agent の二種類しかないのだが

通信の中身は pageant と ssh-agent は同じなので一種類です。通信チャネルが違うだけですね。

  • Pageant: 共有メモリ, 名前付きパイプ
  • ssh-agent: UNIXドメインソケット, 名前付きパイプ

PuTTYがECDSA/Ed25519鍵に未対応の時代に、gpg-agent上のECDSA/Ed25519鍵をPageant互換I/Fを通してTera Termが利用出来たりしていました。
これも通信の内容自体はssh-agentと同じなので既に決まっていたからですね。

かりやみつるかりやみつる

コメントありがとうございます!

通信の中身は pageant と ssh-agent は同じなので一種類です。通信チャネルが違うだけですね。

えっ、そうだったんですね!てっきり pageant は独自のモノだと思ってました。(ちゃんと調べてなかったのがバレてしまった…
あとで記事の方も修正します!

PuTTYがECDSA/Ed25519鍵に未対応の時代に、gpg-agent上のECDSA/Ed25519鍵をPageant互換I/Fを通してTera Termが利用出来たりしていました。
これも通信の内容自体はssh-agentと同じなので既に決まっていたからですね。

そんな時代が…知らなかった…(素人並みの感想