Windowsでのssh agent

Windowsでssh関係を利用する時のssh-agentになりうるものについてまとめました。
というかその予定(今後増補改訂を徐々にしていく)

# 現在の運用
gpg-agent(Gpg4winより) + ssh-pageantを連携させることで

* gpg-agent : 鍵の管理、PuTTY(pageant)のagent接続を担保
* ssh-pageant : Git for Windows SSHのagent接続を担保(gpg-agentへバイパス)

としています。

# ssh agent
## 基本
sshが公開鍵認証する時に、公開鍵を保持し、sshクライアントから渡される認証時の暗号化された情報の解読処理をする、はず。
はず、なのは、ssh-agentとPageantでやってることの詳細や、それが同じかなどについて把握できなかったため。

パスフレーズについても、一定時間キャッシュするなどができる。
また、AgentForward機能で踏み台にした先で有効にすることができるなどあるが、その特性から注意は必要。

# Windowsでの利用
## Pageant
PuTTY付属、PuTTY独自の通信でのssh-agent
P(uTTY) agentではないのがポイント(?)、誤字なのかな?

Windows上のGUIでssh通信するツールで一般的にいろいろ使われる、PuTTY以外のツールはPlink経由になってることが多い。

コマンド引数として鍵を指定可能。なので、スタートアップに登録し鍵を読み込み済みで起動時から居座らせるのが王道?

注意点として、鍵があまり多いと、ssh通信での認証のリトライ数を越えてしまい認証できない、ということはある(PuTTY + Pageantで鍵何個かで発生を確認したことがある)
追記:[[Too many authentication failures for ec2-user]で、EC2にSSH接続出来無い場合の解決方法](http://qiita.com/takachan/items/2d5b7398c0d727ca1842)と同じく、Too many auth...が出ていた(はず)
これが発生するのは、ssh-agentとは違いPageantは鍵の指定などがなく、認証での指定を順次実施するようになってるから、らしい(これも情報ロスト)
追記 2016/05/26
これについて、以下をすれば対応できることが分りました。
1. ふつうにsshでも発生する
2. 回避するにはputtyならppk鍵を指定したエントリを作成して利用する。sshならconfigにIdentitiesOnlyを指定する([参考](http://tkuchiki.hatenablog.com/entry/2013/02/20/104609))
で対応できるようです。PuTTYもpageantでパスワードを聞かれずに接続できるそうです。

また、sshクライアントとは独自通信(Windows固有?)で環境変数などが不要なのは便利、だがそれゆえに、その通信を処理的に遮るものはなく、さらに鍵データがオンメモリにわりとそのまんまのってるらしい(情報源わすれた)とも聞くので注意。

## ssh-agent
OpenSSHの本来のもの。Cygwin/MSYS環境内で閉じているなら、利用可能なはず。
gitでは、sshとあわせて付属しており、git bashシェルと合せて利用することで*nix風に使うことができるとのこと。
[note](http://techblog.clara.jp/2014/07/ssh-agent/) より、csh/bsh系の環境変数設定オプションがあるので、それで設定を展開すればよい様子

## ssh-pageant
ssh-agentのインタフェースで、内部処理をPageantへバイパスする。MSYSでビルドされてる。

参考 [Git for WindowsのシェルからPageantでSSH](http://qiita.com/jkr_2255/items/f1ebd3fa4a9bf8ee1b03)

## gpg-agent
実運用について色々は
参考 @spiegel-im-spiegel さんのサイトより [GnuPG Modern Version for Windows ― gpg-agent について](http://text.baldanders.info/remark/2016/03/using-gnupg-modern-version-2/)
を読むのが吉、stableでも同じようにいけました。確認はまだagent機能だけですが。

GnuPGでのagentソフト、ssh-agentとPageantの両方を受け付けできる、一部機能はssh-agentより便利などがあるらしい。
<del>また、sshの鍵はgpgの鍵輪に取り込む必要があるはず。</del>(追記:ssh-addで覚えさせると、.gnupg/sshcontrolに記録し、適時処理してくれるとのこと [note1](http://www.soum.co.jp/misc/inajima/gpg-agent/index.html) [note2](http://www.baldanders.info/spiegel/log2/000770.shtml)
あと、GnuPGはSmartCardのハンドリングができるので、そっち方向でも有用かもしれない。

参考 @spiegel-im-spiegel さんのサイトより [GnuPG 2.1.0 (modern) for Windows のインストール](http://www.baldanders.info/spiegel/log2/000770.shtml)

なお、現在の状況について、上記記事に補足すると
1. 最近では利用するにGnuPG modern(2.1系)じゃなくて、GnuPG stable(2.0系)でも大丈夫になってる、なのでGpg4Winを入れればよい。
2. <del>gpg-agentの有効方法は自分もよくわからないが、クリーンな環境にGpg4Winを入れれば自動で有効になるっぽい</del>(追記:起動すると考えていた環境は、初っ端にOutlook(with GPGOL)を起動しており、そこでKleopatraが起動したため常駐していた。単発でKleopatraを起動させれば常駐することを確認)
3. Gpg4WinだとGPAじゃなくてKleopatraから設定できる
4. ここまでやっといてなんだけど、gpg-agentが反応するのは確認しているが、sshとのやりとりでssh-agent/pageantインタフェースを実用レベルで使ったことはないので、がんばってください。

gpg-agentのソケットファイルは~/.gnupg/S.gpg-agent.sshなどになるが、これをSSH_AUTH_SOCK環境変数に設定したがgitのssh-add(MSYSのはず)から上手く処理できなかった。(Error connecting to agent: Bad file descriptor)
(追記:[note3](https://superuser.com/questions/911496/gpg-agent-under-windows-as-ssh-agent-for-git-bash)も参考に)
どうも、Git はすでにMSYSから離れてしまったようなので、ディスクリプタでのアクセスが互換性がない様子...

また難点として、自動的に設定される部分(自動起動など?)も多く、素でインストールしただけではうまくいかない(gpg-agentが自動起動していないことがあった)場合は、リカバリがうまくできなかったこと。

## KeePass + KeeAgent
Pageant互換I/Fおよびssh-agent互換I/Fを供えている。
KeePassをトレイ格納状態で待機させておき、要求がくると、KeePassファイルのパスフレーズ要求することで、ssh鍵の実データを取得、解読するという流れなので、素のPageantよりは安全と思える。
KeePassのファイルに鍵が入るので、Dropboxでの鍵管理/移動などが比較的安全に行えるかな。

自分はこれ+ssh鍵のプライベートリポジトリでの運用という邪道をしている...。

なお、ssh-agent互換I/Fについては、ソケットファイルの生成についてCygwin(と大部分のMSYS)互換とmsysGit互換と[ある](http://lechnology.com/software/keeagent/usage/options-and-settings/#global-options)ので、いろいろ試してみてください。
<del>自分は現状上手くGit for Windowsと連携できませんでした(Cygwin互換ソケットで要求を受けたが、認証が進まなかった...msysGit側は反応なし)</del>(追記:Cygwin/MSYSソケットで動作、ただこの時、Pageant的に上からなめていってほしいが、最初の鍵で処理がとまった様子、だれかの追試もとむ)

この場合では、SSH_AUTH_SOCK環境変数に上記で生成するソケットファイルのパスを固定記載するとよい。


# 連携の注意点

上記では

- Pageant I/F
- ssh-agent I/F

という区分があり、ツールによって両方備えていたりする。
場合によって組合せが発生するので、注意点を列挙する。 

## Pageant
上記の通りの特性。

## Pageant + KeePass/KeeAgent
KeeAgentのPageant動作は、Auto/Agent/Clientという動作がある。
Agentは単独でPageantとしての動作、Clientは他のPageantへ中継して問合せる動作(先に起動しているPageantがあっても問題をおこさない)。

自分の環境に合せること。

## gpg-agent+Pageant互換のなにか
gpg-agentはssh-agent/pageant機能をオプションでOn/Offできるので、調整する。
ただ、使うなら、この組合せはあんまりないだろうとは思う。

## その他の組合せ
上記を読んで調整してください。