なるべく脳死でコマンドコピペのみで行けるようにしてます。
GitHub上で初めてSSH接続したい方向け。
解説も書いてますが、急いでる方は飛ばしてもOK。
開発環境はMacを想定。
手順
- 新しいSSHキーを生成
- SSH キーを ssh-agent に追加
- GitHub で自分のアカウントに SSH 公開キーを追加
- 登録したいGitHubのリポジトリのリモートURLを変更
-
git pull
できるか確認
1. 新しいSSHキーを生成
$ ssh-keygen -t ed25519 -C "your_email@example.com"
# 鍵の保存場所を聞かれるが、EnterでOK(\/home/yourname/.ssh/`に保存される)
$ Enter file in which to save the key (/home/user/.ssh/id_ed25519):
# 以下の通りパスワード入力求められるので入力
> Enter passphrase (empty for no passphrase): [Type a passphrase]
# 確認用でもう一度入力
> Enter same passphrase again: [Type passphrase again]
コマンドの解説(読み飛ばし可)
ssh-keygen
SSH 鍵ペア(公開鍵と秘密鍵)を作成するコマンド。
-t ed25519
生成する鍵の種類(キータイプ)を指定するオプション。
Ed25519 は楕円曲線暗号 (Elliptic Curve Cryptography, ECC) の一種で、従来の RSA や DSA よりも セキュリティが高く、鍵のサイズが小さい という特徴がある。
Ed25519 のメリット
- 既存の 3072-bit RSA 鍵と同等以上のセキュリティを持つ
- 署名の速度が速く、鍵のサイズが小さい(管理しやすい)
- 既知の攻撃に対して強い耐性を持つ
- OpenSSH 6.5 以降でサポートされている
-C "your_email@example.com"
鍵のコメントを設定するオプション。
通常、GitHub や GitLab で SSH 鍵を管理する際の識別子としてメールアドレスを指定することが多い。
-C を使うことで、複数の鍵を扱うときにどの鍵がどの用途かを分かりやすくするためにコメントを追加できる。
SSH 鍵の中にコメントが含まれるので、後で ~/.ssh/id_ed25519.pub を見ると、末尾に "your_email@example.com" が付いているのが確認できる。
2. SSH キーを ssh-agent に追加する
バックグラウンドでssh-agentを開始
$ eval "$(ssh-agent -s)"
> Agent pid 59566 # ←pidの番号は人によって変わる(当然)
~/.ssh/config
ファイルを修正
$ open ~/.ssh/config
> The file /Users/YOU/.ssh/config does not exist.
# 以下のコマンドでファイルを作成
$ touch ~/.ssh/config
# 以下をファイル内に追加
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
※ open ~/.ssh/config
でファイルが開かれた場合、ファイルが存在しているということ。よって、以下の記述をファイルの一番下に追記。
→githubの設定がある場合は記述を削除して以下を貼り付けるか、マニュアル参照して対処。
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
SSH秘密鍵をssh-agentに追加して、パスフレーズをキーチェーンに保存
MacOSを想定しているため、--apple-use-keychain
を使用してキーチェーンにパスフレーズを保存
$ ssh-add --apple-use-keychain ~/.ssh/id_ed25519
GitHubアカウントへの新しい SSH キーの追加
以下のコマンドで公開鍵をコピー
$ cat ~/.ssh/id_ed25519.pub
> ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxx...
# 上記の`ssh-ed25519...`の部分を全てコピー
コマンドの解説(読み飛ばし可)
eval "$(ssh-agent -s)"
-
ssh-agent -s
SSHエージェントを起動→環境変数の設定するためのシェルスクリプトを出力
$ ssh-agent -s
> SSH_AUTH_SOCK=/tmp/ssh-RANDOM/agent.12345; export SSH_AUTH_SOCK;
> SSH_AGENT_PID=12345; export SSH_AGENT_PID;
> echo Agent pid 12345;
素直に環境変数を設定するなら、ターミナルで SSH_AUTH_SOCK=/tmp/ssh-RANDOM/agent.12345;
をコピペ実行→export SSH_AUTH_SOCK;
をコピペ実行...
やってられないので、ここでeval
が出てくる
-
eval
ssh-agent -s
の結果をシェルスクリプトとして実行する。
;
で実行コマンドを区切るため、順番に環境変数を設定できる。
$()
とすることでコマンド置換され、()
内のコマンドの出力を取得
$ eval "SSH_AUTH_SOCK=/tmp/ssh-RANDOM/agent.12345; export SSH_AUTH_SOCK;
SSH_AGENT_PID=12345; export SSH_AGENT_PID;
echo Agent pid 12345;"
~/.ssh/config
の存在理由
SSHの接続設定をカスタマイズするための設定ファイル(そのまま)
Linuxにおける~/.ssh/config
はSSHは、設定を以下の順で読み込む
-
/etc/ssh/ssh_config
:システム全体の設定 -
~/.ssh/ssh_config
:ユーザーごとのシステム設定
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
-
ssh-add
- バックグラウンドで動作し、SSH認証を管理
-
ssh-add
を使って秘密鍵をssh-agent
に追加すると、パスフレーズの入力のかわりにssh-agent
が認証を処理する -
ssh-agent
稼働中は、SSH鍵のパスフレーズが不要
-
--apple-use-keychain
オプション-
ssh-agent
はターミナルを閉じるとパスフレーズを忘れる - macOSのキーチェーンにパスフレーズが保存されるため、次回以降
ssh-add
が不要。 - キーチェーンはmacOSに標準搭載されるパスワード管理システム
-
~/.ssh/config
ファイルの中にUseKeychain yes
の記述で、ssh-agentはキーチェーンを参照する
-
そもそもssh-*
コマンドはなぜ使えるのか
OpenSSH (OpenBSD Secure Shell)によって機能が提供されている。
ssh-agent
や ssh-add
は、SSH (Secure Shell) プロトコルのための補助ツール。
他にもssh
,sshd
,ssh-keygen
もあり、これらはMac/Linuxに標準搭載されている。
https://www.openssh.com/
3. GitHubのSSH keys画面で設定
- 「New SSH key」クリック
- 「Title」>任意の名前で設定
- Key type>「Authentication Key」
- コマンドラインでコピーした公開鍵を貼り付け
- 「Add SSH key」クリック
「Title」に設定した鍵名が表示されたらOK
接続確認
以下のメッセージが表示されたらSSHに成功
$ ssh -T git@github.com
> Hi あなたのユーザー名! You've successfully authenticated, but GitHub does not provide shell access.
逆に、以下のメッセージは失敗、何かがうまくいっていない
$ ssh -T git@github.com
git@github.com: Permission denied (publickey).
4. 登録したいGitHubのリポジトリのリモートURLを変更
Git のリポジトリが HTTPSの場合、SSH 認証が適用されない。
現在の設定を確認し、必要があれば変更する
以下の場合、HTTPSでの接続
$ git remote -v
> origin https://github.com/your-username/your-repository.git (fetch)
> origin https://github.com/your-username/your-repository.git (push)
SSHに変更する
$ git remote set-url origin git@github.com:your-username/your-repository.git
# 確認
$ git remote -v
# 以下ならOK
> origin git@github.com:your-username/your-repository.git (fetch)
> origin git@github.com:your-username/your-repository.git (push)
- 公開鍵 (~/.ssh/id_ed25519.pub) が GitHub に正しく登録されているか確認。
- ssh-agent に鍵が追加されているか確認 (ssh-add -l)。
- ~/.ssh/config の IdentityFile が適切か確認。
5. git pull
できるか確認
ID/Passを求められずに操作が完了できればOK
$ git pull origin main
参考
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/about-ssh
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account