PuTTY pageantを使っでgit for Windowsに公開鍵認証を設定

# 概要
windows環境のgitで公開鍵認証を設定する手順
PuTTYを利用する事でパスフレーズを何度も入力する手間を省く。
git bashとPowershellの両方で使えるように。
ついでにログイン時に自動的にpageantが立ち上がるように設定。

# 環境 

- Windows 10 Pro 1709 (64bit)
- [git for Windows (ver.2.17.0)](https://gitforwindows.org/)
- [PuTTY (ver.0.60)](https://www.putty.org/)
- [GitHub](https://github.co.jp/) や [GitLab](https://gitlab.com/)

# 手順

## 事前準備
まずはgitとPuTTYをインストールする。単純にウィザードに従って進めるだけなので説明は省略。


次にssh-keygenで鍵を生成し、GitHubに公開鍵を設定する。コマンドは以下の通り。

```
>ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

その後、GitHubやGitLabのリポジトリのページをブラウザで開き、生成した公開鍵をテキストエディタで開き、コピペで登録する。


詳細は以下のページを参考にしました

> - [お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
> - [SSHでリモートホストに接続する前にやっておくと便利なことは？ ssh-keygenコマンド](http://www.atmarkit.co.jp/ait/articles/1503/20/news007.html)
> - [GitHubの初期設定〜GitHubにSSH接続するまでの設定手順〜](https://qiita.com/godgarden/items/28bc299b35c5c60a5877)


## (参考)この段階でgit cloneを試してみる

リポジトリのページからアドレスを確認し、git cloneを試してみる

```
>git clone git@github.com:github_user_name/repository_name.git
Cloning into 'repository_name'...
Enter passphrase for key '/c/Users/windows_user_name/.ssh/id_rsa':
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
```

cloneはうまく行くが、毎回パスフレーズの入力を求められるのが面倒。
これはPowershellでもgit bashでも同じ。

## 環境変数の設定

環境変数GIT_SSHを作成し、plink.exeのフルパスを指定する。
これにより、gitがSSHキーをplinkを使って探すようになる。
plink.exeはPuTTYをインストールしたパスにある(例: C:\Program Files\PuTTY\plink.exe)。


詳細は以下のページを参考。
> -  [Git for Windowsでplink(putty)を使う](http://d.hatena.ne.jp/hogelog/20120627/p1)

## 秘密鍵をppk形式に変換

ssh-keygenで生成した秘密鍵id_rsaはそのままではpageantに使えない。
そこでPuTTYにあるputtygen.exeを使って「Import Key」->「Save private key」でppk形式(.ppkファイル)に変換する。
詳細は以下のページを参考。

> - [SSH秘密鍵 id_rsa -> putty形式&OpenSSH形式に変換](https://qiita.com/dskst/items/391fc55018fbf3cf795e)

## pageantに秘密鍵を引き渡して起動

Powershellより以下のコマンドで、pageantにppkファイルを引き渡して起動する
(private_key_pathの部分は秘密鍵を置いたパスに読み替えて)

```
pageant C:\private_key_path\id_rsa.ppk
```

そうするとパスフレーズの入力を求められるので、入力する。
これでpageantへの鍵の登録が完了。

## (参考)再度git cloneを試した  

```
>git clone git@github.com:github_user_name/repository_name.git
Cloning into 'repository_name'...
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 256 2e:65:6a:c8:cf:bf:b2:8b:9a:bd:6d:9f:11:5c:12:16
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n)
```

サーバーのSSH鍵を信頼するか聞かれるが、**何故かキーボード入力を受け付けず操作不能となった**

## サーバーSSH鍵をPuTTYに登録  

それならPuTTYのGUIを直接叩いて登録してしまえ、という事でputty.exeを起動。  
下記画面の「Host Name」にアドレスを入れて「Open」ボタンをクリック。
![putty.png](https://qiita-image-store.s3.amazonaws.com/0/251696/f72177cd-eb45-d81d-7dd6-acc15720cf04.png)
アラートが出てSSH鍵を信頼するか聞かれる。こっちは操作できる。
![puttyAlert.png](https://qiita-image-store.s3.amazonaws.com/0/251696/05605054-d27b-57a2-97cc-895937d8899d.png)

## (参考)もう一回git cloneを試した

```
>git clone git@github.com:github_user_name/repository_name.git
Cloning into 'repository_name'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
```

ついに何も聞かれなくなった。
しかし、起動後に毎回手動でpageantを起動する必要があり、これが割と面倒

## タスクスケジューラを設定

まずは、Pageantを起動するためのPowershellスクリプトを作成する
(この程度の内容ならbatでも良いけど一応Powershellで)

```startPageant.ps1
pageant C:\private_key_path\id_rsa.ppk
```

タスクスケジューラを開き、このスクリプトがログイン時に起動するようにする
設定は以下の通り。

- トリガー: ログオン時
- プログラム/スクリプト: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- 引数の追加: .\<スクリプト名> (例 .\startPageant.ps1)
- 開始: <スクリプトのパス> (例. C:\script\)

なお、Powershellスクリプトを使う場合はExecutionPolicyをRemoteSignedかそれより緩くする必要がある。

詳細は以下のページを参考。
> - [WindowsのタスクスケジューラーでPowerShellのスクリプトを実行する際には「パス」に注意](http://www.atmarkit.co.jp/ait/articles/1412/03/news125.html)
> - [Set-ExecutionPolicy コマンドレットの使用 ]( https://technet.microsoft.com/ja-jp/library/ee176961.aspx )

これで、ログオン時にpageantが自動で立ち上がり、パスフレーズを聞いてくるようになる。