【初心者向け🔰】SSH鍵を生成するコマンドと全手順解説（まとめ）

## 概要
あんまり頻繁に使わないため、備忘録ついでに初心者向けに情報をまとめて残す。

SSH 鍵を生成する `ssh-keygen` コマンドの基本的な使い方
その際、ファイル名を指定して生成する方法や、その他関連コマンドなどの備忘録

### 利用用途
GitHub や GitLab 等のサービスとの SSH 通信時に必要になる鍵ファイル（公開鍵/秘密鍵）を生成する

## 手順

### コマンドの基本形
基本的に鍵生成コマンドは以下。これを実行するだけでPC内にペアの鍵が生成される。

```bash
ssh-keygen
```

しかし、これではセキュリティが甘く、生成される鍵の管理もしづらいので、以下のようにオプションを付与するのが実際の使い方。

### 現在の最新手順（推奨）
`-C` と `-f` の書き方はサンプル

```bash
ssh-keygen -t ed25519 -C "user_name@device_name" -f ~/.ssh/id_ed25519_user_name
```
**オプションの意味**（詳細は後述）
- `-t`: 暗号方式（**Ed25519 方式** を指定）
- `-C`: コメント（任意だが、**「ユーザ名@デバイス名」** がオススメ）
- `-f`: 鍵ファイルの生成場所（`~/` はホームディレクトリを表す）

**実例**
```bash
# SSH 鍵生成コマンドを実行
$ ssh-keygen -t ed25519 -C "to3izo@macstudio_m2" -f ~/.ssh/id_ed25519_to3izo

# 実行後: 対話式の質問が始まる
Generating public/private ed25519 key pair. # 訳：「公開鍵/秘密鍵 を生成します」
Enter passphrase for "/Users/to3izo/.ssh/id_ed25519_to3izo" (empty for no passphrase):
  # → そのままエンターキーでもOK
Enter same passphrase again: # → そのままエンターキーでもOK

# 秘密鍵「id_ed25519_to3izo」生成
Your identification has been saved in /Users/to3izo/.ssh/id_ed25519_to3izo
# 公開鍵「id_ed25519_to3izo.pub」生成
Your public key has been saved in /Users/to3izo/.ssh/id_ed25519_to3izo.pub
The key fingerprint is: # 指紋 (キーマップ) を表示
SHA256:******************* to3izo@macstudio_m2
The key's randomart image is:
+--[ED25519 256]--+
|            x    |
|  xxxxxxxxxxxx   |
|    xxxxxxxx     |
|   xx  xx  xxx   |
|xxx   xxxxxx     |
|     xxxx   xxx  |
|xx    xx xxxxx   |
+----[SHA256]-----+

```
→ 上記コマンドを実行すると `~/.ssh/` に `id_ed25519_to3izo` という秘密鍵と、`id_ed25519_to3izo.pub` という公開鍵を生成する。

その後、**「公開鍵」（.pub が付いたファイル名）** の方を、以下のように **cat** コマンド等でファイルの中身を表示する。

```bash
# コマンド実行で中身を表示
$ cat ~/.ssh/id_ed25519_to3izo.pub

# 実行結果 (ファイルの中身)
ssh-ed25519 *****（中略）***** to3izo@macstudio_m2
ssh-rsa *****（中略）***** to3izo3@example.com
```

表示された「ssh-rsa」から始まる文字列を全てコピーして、GitHub 等の SSH Key 登録画面にペーストして使用する。
すると、次回から公開鍵を登録したサイトとの SSH 通信ができるようになる。

### 従来の手順（非推奨）
従来の実行するコマンドの例は以下だった（`-t` 未指定（デフォルト）の暗号方式は **RSA 方式** となる）

```bash
ssh-keygen -C "comment" -f id_rsa_file_name
```

実際に実行すると以下のような動きをする

```bash
# SSH 鍵生成コマンドを実行 (コメントはメールアドレスとかでも良い)
$ ssh-keygen -C "to3izo@example.com" -f ~/.ssh/id_rsa_to3izo

# 実行後
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Your identification has been saved in id_rsa_to3izo # 秘密鍵「id_rsa_to3izo」生成
Your public key has been saved in id_rsa_to3izo.pub # 公開鍵「id_rsa_to3izo.pub」生成
The key fingerprint is:
SHA256:******************* to3izo@example.com
The key's randomart image is:
+---[RSA 3072]----+
|    xxxxx        |
|     xx  x       |
|    xx xx        |
|   x xx xxx      |
+----[SHA256]-----+

# 処理完了
```

→ 上記コマンドを実行すると `~/.ssh/` に `id_rsa_to3izo` という秘密鍵と、`id_rsa_to3izo.pub` という公開鍵を生成する。

```bash
# コマンド実行で中身を表示
$ cat ~/.ssh/id_rsa_to3izo.pub

# 実行結果 (ファイルの中身)
ssh-rsa *****（中略）***** to3izo3@example.com
```

### 暗号方式は RSA じゃダメなのか？
基本的にはこれから作るなら **"Ed25519"** を採用しましょう。

| 暗号方式 | 現状の扱い | 備考 |
| --- | --- | --- |
| **Ed25519** | GitHub 推奨・高速・短い鍵長 | より強固な暗号。執筆現在での事実上のデフォルト |
| RSA (≥3072 bit) | まだ利用可 | コマンド上のデフォルト |
| DSA / 1024 bit RSA | **GitHub で登録不可** | 2022 年に受付終了 ([GitHub Docs][2]) |

※ 未だに RSA 方式で記載される記事や解説も多いので、混乱するかもしれませんが、Ed25519 を推奨します（参考: [Brandon Checketts][1]）

[1]: https://www.brandonchecketts.com/archives/its-2023-you-should-be-using-an-ed25519-ssh-key-and-other-current-best-practices?utm_source=chatgpt.com "It's 2023. You Should Be Using an Ed25519 SSH Key (And Other ..."
[2]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?utm_source=chatgpt.com "Generating a new SSH key and adding it to the ssh-agent"

## コマンドの意味

### 基本コマンド
ただ鍵を生成するだけのコマンド

```bash
# 鍵生成コマンド
ssh-keygen
```

デフォルトの生成ファイルの出力先は `~/.ssh/`
デフォルトの生成ファイル名は `id_rsa` と `id_rsa.pub`

### 名前を指定して作成
ssh-keygen でファイル名を指定して作成する方法。
`-f` オプションでファイル名（厳密には保存先）が決められる

```bash
# 例1. ファイル名を指定して鍵生成
ssh-keygen -f id_rsa_file_name

# 例2. ファイルのフォルダも指定する場合
ssh-keygen -f ./path/to/directory/id_rsa_file_name
```

### 標準出力なしで作成
`-q` 標準出力（実行結果をコンソールに表示すること）を無効にする ＝ キーマップが出ない

```bash
ssh-keygen -q -f id_rsa_file_name
```

### コメントの指定
`-C` オプション
「`ユーザ名@ホスト名`（デフォルト）」以外にする場合に使用
別のメールアドレスとかを使用する（xxx@example.com）

```bash
ssh-keygen -C comment -f id_rsa_file_name
```

### 暗号方式の指定
`-t` オプション
暗号化形式を「rsa（デフォルト）」以外にする場合、「dsa」「ecdsa」「ed25519」から指定

```bash
ssh-keygen -t ed25519 -f id_rsa_file_name
```

### fingerprint の指定
`-E` オプション
鍵のfingerprintを「sha256（デフォルト）」以外にする場合、「md5」指定

```bash
ssh-keygen -E md5 -f id_rsa_file_name
```

## エラー： SSH鍵の権限がオープン過ぎて怒られた場合
何かしら SSH 通信を利用したときに、以下の場合は、SSH キーの権限を変更する必要があります。

発生するエラー: Permissions 0644 for 'id_rsa_xxxxx' are too open.

```zsh
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/xxxxx/.ssh/id_rsa_xxxxx' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxxxx/.ssh/id_rsa_xxxxx": bad permissions
git@github.com: Permission denied (publickey).
```
👉 要訳：「秘密鍵のパーミッションが "644" なので、他のユーザーからアクセスできるような権限では使えないよ ！」

### 権限を変更する
`chmod` コマンドで、書き込み・読み取り・実行権限を変更する（詳しい説明は割愛）

```zsh
# 対象のキーを指定（600 もしくは 400）
chmod 600 id_rsa_xxxxx
```

## おまけ

生成したSSH鍵の公開鍵をコピーするときは、以下でも可能

macOSの場合

```bash
pbcopy < ~/.ssh/ファイル名.pub
```

Windows で Git Bash など使っていた場合

```bash
clip < ~/.ssh/id_rsa.pub
```