SSH鍵の作成方法と -t -C オプションのすすめ

SSH公開鍵・秘密鍵の作成方法をググると `ssh-keygen` をオプションなしで紹介している記事がヒットするので、初心者はそれだけ見て納得し、オプションのことなど知る由もなく仕事に戻っていきますね（自己紹介）。

しかしもう少し調べてみると、できれば `-t` `-C` オプションは毎回付けた方がよいと思いました。

# TL;DR

```
$ ssh-keygen -t ed25519 -C ""
```

# SSH鍵の作成方法

`ssh-keygen` を使います。

```
$ ssh-keygen -t ed25519 -C ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_ed25519): # そのままEnterを押す
Enter passphrase (empty for no passphrase): # そのままEnterを押す（パスフレーズが欲しい場合は入力してEnter）
Enter same passphrase again: # そのままEnterを押す
Your identification has been saved in /home/ec2-user/.ssh/id_ed25519.
Your public key has been saved in /home/ec2-user/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:XXX
The key's randomart image is:
+--[ED25519 256]--+
|.E.  .o+.o       |
|.o . .=.= .      |
|o + +.+*.o o     |
|++.o.=o*=+. .    |
|.o...=*.S+o      |
|    B=.o. .      |
|    .*o  .       |
|    .            |
|                 |
+----[SHA256]-----+
$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKkpYGsqIGWd5Nl0Tp0w9RpT2ghoehsThe71AcmbPb5B
```

## `-t` オプションのすすめ

**`-t` オプションでは暗号アルゴリズムを指定します**。オプションを使用しない場合のデフォルトはRSAです。

OpenSSH 6.5以降であれば、パフォーマンスとセキュリティに優れた[^wiki]**Ed25519を指定**するとよいでしょう。GitHubのドキュメントでも、サンプルコードでEd25519が使われています[^github]。

```
$ ssh-keygen -t ed25519
```

## `-C` オプションのすすめ

**`-C` オプションではコメントを指定します**。コメントは、公開鍵の末尾に付与されます。オプションを使用しない場合は、`ssh-keygen` を実行した環境のユーザー名とホスト名で `username@hostname` の形式になります。

```
$ cat ~/.ssh/id_ed25519.pub 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKkpYGsqIGWd5Nl0Tp0w9RpT2ghoehsThe71AcmbPb5B username@hostname
```

ただし、コメントは必須ではなく、形式も任意です。

生成した鍵をお客様などに渡す場合には、余計な情報となるため、**`-C ""` としてコメントなしで鍵を生成**するとよいでしょう[^kinisuru] [^windows]。

```
$ ssh-keygen -C ""
```

もちろん、鍵の管理のために意図的にコメントを付けたい場合は、付けるとよいです。

### コメントの表示と変更の方法

コメントは秘密鍵にも含まれています。表示するには以下のようにします。

```
$ ssh -l -f ~/.ssh/id_ed25519
256 SHA256:XXX comment (ED25519)
```

秘密鍵のコメントを変更するには、以下のようにします。なお公開鍵のコメントは直接テキストエディターで編集できます。

```
$ ssh -c -C "new comment" -f ~/.ssh/id_ed25519
```

# （おまけ）SSH鍵の登録方法

ローカルの公開鍵を持って行く場合、`ssh-copy-id` を使うと簡単です。

```
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub username@hostname
```

手動でやる場合は以下の流れです。

```
$ scp ~/.ssh/id_ed25519.pub username@hostname
$ ssh username@hostname

リモートサーバーで：
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys
$ rm ~/id_ed25519.pub
$ chmod 600 ~/.ssh/authorized_keys
```

# （おまけ）公開鍵認証を有効化する方法

まだの場合、リモートサーバーで公開鍵認証によるSSH接続を有効化します。

リモートサーバーの `/etc/ssh/sshd_config` を開いて、以下の記述がなければ追記します（先頭に `#` が付いていたら外します。`no` になっていたら `yes` にします）。

```
PubkeyAuthentication yes
```

SSHデーモンを再起動します。

```
$ sudo systemctl restart sshd # OSによって違う
```

# （おまけ）楽にSSH接続する方法

毎回 `ssh -i key username@hostname` と打つのが面倒な場合は、`~/.ssh/config` ファイルに以下のように追記してください（ファイルがなければ作成する）。

```
Host remote
    User username
    HostName hostname
    IdentityFile key
```

※ `Host` の `remote` の部分は任意の名前。

そうしたら、`ssh remote` で接続できます。

[^wiki]: [SSH 鍵 - ArchWiki](https://wiki.archlinux.jp/index.php/SSH_%E9%8D%B5)

[^github]: `$ ssh-keygen -t ed25519 -C "your_email@example.com"`、[Generating a new SSH key and adding it to the ssh-agent - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)

[^kinisuru]: [sshの鍵を作るときにちょっとだけ気にしたいこと | DevelopersIO](https://dev.classmethod.jp/articles/ssh-keygen-tips/)

[^windows]: WindowsのPowerShellだと `option requires an argument -- C` と怒られてしまいます。コマンドプロンプトだと大丈夫。