GitHubのSSHKey作成で悩んだ話

## 概要

GitでHTTPS通信をしていると
よくGitHubのユーザ名とパスワードを聞かれて
SSHで対応しようとしたら
ハマったので備忘録の為にも書き込んでおこうと思いました。

※2018/10/14追記
疎通確認を忘れていたのと
デバッグの疎通確認も知ったので追記します。

## 使用環境

Windows10
Git version 2.16.2.windows.1

## 悩んだ点

まずSSHKeyの生成方法を理解していなかった
なのでGitのssh-keygenの実行ファイルの場所が分からない
~~勝手にWindowsがBOM付けるから面倒ごとが増えた~~

では、ハマってしまった経験を生かして
次にやっても難なくできるように手順を書き込んでおきます

## 事前準備

WindowsにGitをインストールしておいてください。
参考になるページを見つけたので載せておきます。
[自分用 Git For Windowsのインストール手順](https://qiita.com/toshi-click/items/dcf3dd48fdc74c91b409)

## SSHKeyを生成

いつのバージョンか知らないのですが
SSHKeyがホームディレクトリで生成できたような記事を見つけましたが
自分の環境では通らなかったので
`C:\Program Files\Git\usr\bin`にssh-keygenの実行ファイルがある前提で話をします。

``` PowerShell:WindowsPowerShell
PS C:\Users\[ユーザ名]> cd 'C:\Program Files\Git\usr\bin\'

PS C:\Program Files\Git\usr\bin> .\ssh-keygen -t rsa -b 4096 -f "~/.ssh/id_rsa" -N ""
Generating public/private rsa key pair.
Your identification has been saved in [ユーザディレクトリ]/.ssh/id_rsa.
Your public key has been saved in [ユーザディレクトリ]/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:[略] [デフォルトコメント]
The key's randomart image is:
+--[ RSA 4096]----+
|        略       |
+-----------------+
```

**2018/6/17更新**
鍵の長さがデフォルト鍵長の2048bitで生成していたため
`-b 4096`を追記しました。

**2019/1/10更新**
ファイル名の指定を追加しました。

**2019/08/30更新**
ワンライナーに対応しました。

`-C`オプションを削除しました。
理由として必須ではないからです。

`-N`オプションを追記しました。
パスフレーズの入力をカットします。

> `[メールアドレス]`はGitで使うメールアドレスを指定してください
恐らくpush先で使うからだと思うのですが
知っている方いたらコメントいただけたらと思います。
追記いたしますので。
サイトによってはただのコメントであったり
push先(で使っている)のメールアドレスだったりとか
バラバラなので...

上記は以前書いていたものですが
`-C`オプションはデフォルトでユーザ名を入れるようです。
私は問題ないのですがよく見かける例で行くと
メールアドレスを指定するようなので
`-C "[メールアドレス]"`と追記してください。

`-f [ファイル名]`は
デフォルトの公開鍵でいう`id_rsa.pub`の~~`id_rsa`の部分です。~~
**正確にはそれまでのファイルパスも含みます。**
**相対パスであればユーザディレクトリに続くパスから指定します。**
ちなみに省略可能です。
省略するとどこに鍵を保存するか聞かれます。
そのままEnterを押下すると上記の例でのパスで保存されます。

パスフレーズですが
上記例では`-N`オプションで入力していません。
入力する場合は引数に指定するか
`-N`オプションを削除し対話式での入力を行ってください。

そうするとSSHKeyのイメージ(？)が表示されますので
これで生成はできました！

## GitHubに公開鍵を預ける

預けることができればSSH通信ができるようになります！
そこでも詰まった私ですが...

まずホームディレクトリに戻ってもらいます。

``` PowerShell:WindowsPowerShell
PS C:\Program Files\Git\usr\bin> cd ~
```

そして生成されたSSHKeyの場所まで行きます

``` PowerShell:WindowsPowerShell
PS C:\Users\[ユーザ名]> cd .\.ssh\
```

次は生成された公開鍵をクリップボードにコピーします

``` PowerShell:WindowsPowerShell
PS C:\Users\[ユーザ名]\.ssh> cat .\id_rsa.pub
```

catでGet-Contentが呼ばれるはずですが
使えないようでしたらcatを`Get-Content`に置き換えてください。

表示された文をコピーしてください。

※ちなみにワンライナー
``` PowerShell:WindowsPowerShell
PS C:\Users\[ユーザ名]\.ssh> cat ~\.ssh\id_rsa.pub
```

そして次はGitHubに移ります

[SSH and GPG keys](https://github.com/settings/keys)
恐らくここから飛べるのではないかなと思います。
そこのNew SSH Keyボタンを押下してください

![スクリーンショット (15).png](https://qiita-image-store.s3.amazonaws.com/0/192334/994d1f3a-306f-8959-5658-f1e65f7fd391.png)
次にタイトル(機種名が判別しやすいと思います)と
公開鍵のファイルの内容を入力します。
先ほどテキストエディタに張り付けてコピーし直してもらったものです
ちなみにBOM入りだと
![スクリーンショット (16).png](https://qiita-image-store.s3.amazonaws.com/0/192334/cfab1e6e-cafd-2a71-c398-869d026eb6fb.png)
という風に怒られました
この厳格さのおかげで秘密鍵を登録してしまうのも防げるとか...

あとはAdd SSH Keyを押下するだけです！
その後は自由にpushするなりpullするなりどうぞ！

## 疎通確認

最初に書いたときには疎通確認を忘れていました。
確認もせずに何をしているのか・・・
ということで確認します。

```PowerShell:WindowsPowerShell
PS C:\Users\[ユーザ名]\.ssh> ssh -T git@github.com
```

これだけですね。
実行するとこんな感じの文が出ると思います。

```
The authenticity of host 'github.com (IPアドレス)' can't be established.
ECDSA key fingerprint is SHA256:[略].
Are you sure you want to continue connecting (yes/no)? 
```

yesと入力してください。

```
Warning: Permanently added 'github.com,IPアドレス' (ECDSA) to the list of known hosts.
Welcome to GitHub, [ユーザ名]!
```

完了です。
お疲れさまでした。

## 参考にしたページ

[WindowsでSSHの鍵を作る](https://qiita.com/digdagdag/items/9e5c061e7d86e0af9a57)
[SSHの公開鍵を作成しGithubに登録する手順](http://monsat.hatenablog.com/entry/generating-ssh-keys-for-github)

**2018/6/17更新時**
[お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)

**2019/08/30更新時**
[ssh-keygenをパスフレーズの確認なしで作成する](https://qiita.com/genreh/items/acfa49f569f665c8f024)