ある日突然「OpenSSH用に公開鍵ちょうだい」と言われたら？今さら聞けないOpenSSH公開鍵の作り方（Windows向け解説）

# OpenSSH用公開鍵の作成方法
「公開鍵ください」とメールしてちゃんとした鍵が貰える確率が著しく低い。
あれ？って思って適当にググったけど、公開鍵作成に関する良い記事がない。
なので作った。基本的にはWindows向けに書いています。

## tl;dr
作ったファイルの中身が「ssh-rsa 」で始まっていたらそれをサーバ管理者にメールかなんかで送ってください。
公開鍵を作る方法はいくつかあるけど、puttygenを推奨します（英語だからギブアップする人が多そうなので、どのボタンを押せレベルで解説します）
一番簡単なのはTeraTermだけど、エージェント転送したくなったときに面倒くさいからおすすめしません（その場合の方法も最後に書いておきましたが）

## 公開鍵認証について

LinuxのサーバなどのホストにSSHでログインする際には、何らかの形でユーザー認証が必須（だよね？）
ユーザ認証にはパスワード認証が最も使われていると思うけど、比較的破られやすいのでこれを嫌う管理者も多いハズ。
そのため公開鍵認証がよく使われるが、おそらくLinuxで最も使われているだろうOpenSSHは独自形式の公開鍵を使う。
なので、「適当にググって公開鍵を作ってメールで送って」とか言うとRFC4716形式や、PEM形式(PKCS#1形式やPKCS#8形式)など、OpenSSH形式とは違う形式の公開鍵を渡されるトラブルが多い。（これは作る側ではなく指示を出す側の問題だと個人的に思っているので、このような記事を書いた）
ちなみにOpenSSH形式は、RFC4716形式の公開鍵と似たような形式なので、手作業で変換することもできる。
けど、この際だからOpenSSH形式での作り方を覚えてもらいたいなと思います。

## 作成方法
基本はファイルの中身が「ssh-rsa 」で始まるファイル(これがOpenSSH形式のファイル)を作成し共有してもらいます。

公開鍵認証を利用したログイン方法についてここでは詳細な説明はしません。

作成は次の3つの方法のいずれかで可能です。

1. puttygenでの作成(Windows環境で作るなら一番簡単）[推奨]
1. Tera Termでの作成(簡単だが、そのままではエージェント転送ができない)
1. ssh-keygenコマンドを使う(最も正しい方法だがLinux用のコマンド）

### puttygenでの作成
- puttygenを入手するためにWinSCPをインストール
 - WinSCPはフリーウェアなのでネットから適当に検索して入手
 - WinSCPの代わりにputtyまたはputtygenそのものを入手してもOK
- WinSCPのインストールディレクトリにあるPuTTYのディレクトリを参照
 - 通常は 「C:\Program Files (x86)\WinSCP\PuTTY」にある
- puttygen.exeを起動
- "Generate a public/pribate key pair"の横の[Generate]をクリック
- マウスカーソルをたくさん動かして鍵ペアを作成
- "Key comment"のところに自分が分かりやすいように名前を付ける
 - 例: 「rsa-key-USERNAME@example.com-20180625」
- "Key passphrase"のところにパスフレーズ(パスワード)を設定（このパスフレーズは頻繁に入力することになる）
- "Confirm passphrase"にもう一度同じパスフレーズを入力（確認用）
- 次の方法で3つのファイルを作成(この3ファイルはセットになるので、他と混ざらぬよう新しくフォルダを作ってそこに保管することが望ましい）
 - 公開鍵ファイルを作成する（共有不要）[RFC4716形式]
     - "Save the generated key"の横にある[Save public key]をクリック
     - 自分のPCの適当なフォルダに保存する。（ファイル名は拡張子を.pubにする事が望ましい)
 - 秘密鍵ファイルを作成する（共有禁止。漏えいした場合は関係者に速やかに報告すること）
     - "Save the generated key"の横にある[Save private key]をクリック
     - 自分のPCの適当なフォルダに保存する。（.ppkファイルで保存する)
 - authorized_keys用の公開鍵を作成する（メール等で共有可）[OpenSSH形式]
     - "Public key for pasting into OpenSSH authorized_keys file:"と書かれているところの下にある
「ssh-rsa」で始まるテキストを全て選択し右クリック→コピー
     - テキストエディタに張り付けて適当なフォルダに保存（USERNAME.pub のようなファイル名が望ましい）
     - このファイルをサーバ管理者に共有（メールで送付等）
- 使うときはpagent（pagent.exe）を起動し、通知領域(画面右下、タスクバーのアイコン)からadd keyで作成した秘密鍵ファイルを指定し、Tera Teamでは「pagentを使う」にチェックを入れて接続する。
 - エージェント転送(agent forwarding)を使う場合にはこの時「エージェント転送する」にもチェックを入れる。

### Tera Teamでの作成
- Tera Teamをインストールし起動
- 設定→SSH鍵生成
- 「生成」をクリック
- 「鍵のパスフレーズ」にパスフレーズ(パスワード)を設定（このパスフレーズは頻繁に入力することになる）
- 「パスフレーズの確認」にもう一度同じパスフレーズを入力（確認用）
- 「コメント」に自分が分かりやすいように名前を付ける
 - 例: 「rsa-key-USERNAME@example.co.jp-20180607」
- 次の方法で2つのファイルを作成(この2ファイルはセットになるので、他と混ざらぬよう新しくフォルダを作ってそこに保管することが望ましい）
 - 公開鍵ファイルを作成する（メール等で共有可）[OpenSSH形式]
     - 「公開鍵の保存」をクリック
     - 適当なフォルダに保存（USERNAME.pub のようなファイル名が望ましい）
     - このファイルをサーバ管理者に共有（メールで送付等）
 - 秘密鍵ファイルを作成する（共有禁止。漏えいした場合は関係者に速やかに報告すること）
     - 「秘密鍵の保存」をクリック
     - 適当なフォルダに保存

以上で、完了。
公開鍵認証でログインするにはTera Teamなら「RSA/DSA/ECDSA/ED25519鍵を使う」にチェックを入れて秘密鍵ファイルを指定する

### ssh-keygenによる作成
 ※玄人向けとして簡単に書いてます

- Linuxのホストで次のコマンドを実行

```shell
ssh-keygen -t rsa
```

- 実行例  

```shell
[USERNAME@myhost test]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/USERNAME/.ssh/id_rsa): 
/home/USERNAME/test/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/USERNAME/test/id_rsa.
Your public key has been saved in /home/USERNAME/test/id_rsa.pub.
(出力省略)
```

## 既に作った秘密鍵をpagentで使う方法
- puttygen を起動する
- Load an existing private key file [Load] をクリック
- 作成した秘密鍵を読み込む
 - 秘密鍵ファイルを作成する（共有禁止。漏えいした場合は関係者に速やかに報告すること）
     - "Save the generated key"の横にある[Save private key]をクリック
     - 自分のPCの適当なフォルダに保存する。（.ppkファイルで保存する)