[入門] SSH を利用した Github への接続設定

## 対象読者
- Github にSSHの接続したい方

## 環境
MacBook Pro M3 Pro

## 概要
ここでは、SSHを利用した認証設定を行います。
これにより、リモートのサーバーやサービスに、ユーザー名と personal access token を入力することなく、GitHubに接続できます。


## 1. 既存のSSHキーを確認する
はじめに、ローカルに既存のSSH key が存在するか確認します。
~~~
$ ls -al ~/.ssh

#ログの例
-rw-------    1 hiro  staff  2622  6 17  2025 id_rsa
-rw-r--r--@   1 hiro  staff   587  6 17  2025 id_rsa.pub
-rw-------    1 hiro  staff   933  4 11  2025 known_hosts
~~~

ここのログの例では、``id_rsa`` と ``id_rsa.pub`` のキーペアが存在しているので、これらを使ってGitHubの認証設定を行うことができます。新しくキーを生成する必要はありません。

### 秘密鍵と公開鍵について

- id_rsa
  秘密鍵と呼ばれるものです。これは**絶対に他人に共有してはいけない**``秘密の鍵``です。
  生成するマシンのローカルに保存されています。

- id_rsa.pub
  .pub が``公開鍵``と呼ばれるものです。これがGitHubに登録する鍵となります。
  Githubでは、id_rsa.pub・id_ecdsa.pub・id_ed25519.pubのファイル名が既定でサポートされています。

- known_hosts 
  接続したことのあるSSHサーバーの情報です。
  GitHubのサーバー情報などが記録されています。
  
 
キーペアが存在しない場合、別のキーペアを使用する場合は、次の手順へ進んでください。

## 2. 新しい SSHキーを生成する
以下のコマンドで、キーペアを生成します。
~~~
$ ssh-keygen -t ed25519 -C "your_email@example.com"

Generating public/private ed25519 key pair.
> Enter file in which to save the key (/Users/YOU/.ssh/id_ed25519): [Press enter]
> Enter passphrase (empty for no passphrase): [Press enter]
> Enter same passphrase again: [Press enter]
~~~
上記の隠しフォルダ ``.ssh`` 直下に作成してよいのか尋ねられるので enter を押します。
その次に、passphrase をどうするか尋ねらますが、empty で良いので enter を押します。

![スクリーンショット 2025-01-15 13.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786602/5214aef1-5955-070c-e9df-d1036b4446fb.png)

生成が完了したら、.ssh フォルダ直下に``id_ed25519``と``id_ed25519.pub``があることを確認できるはずです。

:information_source: 補足
passphraseを設定することで、セキュリティを高めることができます。ただし、設定した場合は、Git操作のたびに入力が必要になります。

以前に SSH キーを作成した場合、ssh-keygen から別のキーの書き換えを求められる場合があるので注意してください。既存のものを、別のフォルダへ移動させるなど対応しましょう。


## 3. アカウントへの新しい SSH キーの追加
Settings < SSH and GPG keys の ``New SSH Key`` を選択します。

![Monosnap SSH and GPG keys 2025-01-15 12-43-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786602/9eee78e6-f5a6-64b5-0f47-6f19bed7b2fc.png)

Add new SSH Key で各設定を入力していきます。

![スクリーンショット 2025-01-15 13.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786602/843e6f74-874b-77f6-b862-d204bb36a13c.png)

Titleは、公開鍵と対となる秘密鍵を保存しているPC名など適当に決定します。
Key type は、Authentication Key のままにします。
Key の欄に、先ほど作成した ``id_ed25519.pub`` をテキストエディターで開いて、メールアドレス以外の部分を入力します。

![スクリーンショット 2025-01-15 13.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3786602/ae27e3f4-626a-d0a3-098a-7043f7c054d9.png)

入力し終えたら、``Add SSH key``を押して完了です。

これで、Authentication keys の一覧に追加されました。


## 4. SSH 接続をテストする


生成・追加した SSH Key で Github に接続を試みます。
以下のコマンドを実行してください。
~~~
$ ssh -T git@github.com

> The authenticity of host 'github.com (IP ADDRESS)' can't be established.
> ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
> Are you sure you want to continue connecting (yes/no)? [yes enter]
~~~

はじめて接続する時は、上記のようなログが出ると思います。 ``ED25519 key fingerprint ``で接続するけどいいのか問われるので、メッセージのフィンガープリントが、GitHub の公開キー フィンガープリントと一致することを確認します。一致する場合は、「yes」と入力し enter を押します。

その後、接続成功のログを確認することが出来れば、SSHキーを用いた接続設定は完了です。

# SSH 認証について

SSH認証について詳しく知りたい方は、[Githubのドキュメント](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)や下記の動画を参考にしてみるといいかもしれません。

<details><summary>SSH認証について</summary>

クライアント側でキーペアを作成する。
秘密鍵をローカルに、公開鍵をリモートのサーバーなどに配置する。

[SSHとは？【分かりやすい解説シリーズ #65】【プログラミング】 - YouTube](https://www.youtube.com/watch?v=nkqdhXSwEVs)

>  - 別のコンピュタを遠隔操作するツール
>  - 通信は全て暗号化
>  - SSH(Secure Shell) の認証方式
>  - サーバーにリモートログインする時 パスワードでの認証ではなく**公開鍵認証**という認証方式がある
>  - 公開鍵認証
>      - 接続する度にパスワードを入力するのではなく、**秘密鍵と公開鍵**という仕組みを利用してより安全に接続を行う

[公開鍵認証とは？【分かりやすい解説シリーズ #24】【プログラミング】 - YouTube](https://www.youtube.com/watch?v=uURs8HnzCQU)
> 秘密鍵
> - **電子署名**というデータを作成できる
> - ローカルパソコンに保存

> 公開鍵
> - 電子証明データが正しいか**検証**できる
> - サーバーの中に保存

</details>

# まとめ

設定することで、毎回のGit操作でユーザー名とパスワード（またはトークン）の入力するこなく、安全に接続することが出来るようになりました。

秘密鍵は絶対に共有してはいけないことに注意しましょう。


# 参考文献

[SSH を使用した GitHub への接続 - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)

[MacでターミナルからGitHubにSSHキーで接続する方法 - YouTube](https://www.youtube.com/watch?v=LniXMRSyK4Q)