GitHubにSSHで接続する方法【Git/GitHub】

Linux

2021年8月13日以降、GitHubにパスワード接続でpushやpullができなくなりました。

今回、改めてSSHでの接続方法をまとめたのでメモ。
GitHubの公式HPにSSH接続の方法が掲載されています。そちらの情報を参考にしました。
ちなみに作業環境はmacOS Big surです。

SSHキーを生成する

生成するキーの確認

今回生成するSSHキーは「Ed25519」というアルゴリズムを使った鍵です。
「RSA鍵」より強度が高いらしいです。次の名前の公開鍵・秘密鍵を生成します。

公開鍵:id_ed25519.pub(GitHubに登録)
秘密鍵:id_ed25519

.sshディレクトリの確認

生成する前に既存のSSHキーを確認します。
同じ名前のSSHキーを生成すると上書きされてしまうので、それを防ぐためです。
※一応上書きするかどうか聞いてくれますが念の為。

以下コマンドは.sshディレクトリにあるファイルを表示します。
コマンドは次の通りです。

$ ls ~/.ssh

すると以下のような内容が表示されました。

id_rsa      id_rsa.pub  known_hosts m-ke

私の環境ではid_rsa、id_rsa.pubの「RSA鍵」がペアでありました。
今回作る「Ed25519鍵」の名前に重複しないので、このまま作業をすすめます。

SSHキーを生成するコマンドの確認

SSHキーはssh-keygenコマンドで生成できます。

$ ssh-keygen -t ed25519 -C "<コメント:GItHubではemailアドレスの記載を推奨>"

オプションの意味は次の通りです。

オプション
-tどの暗号タイプで生成するか指定。
指定しない場合、RSAが生成される。
-CSSHキーにコメントを追加する。
指定しない場合、Macのユーザアカウント@コンピューター名になる。
コメントを記載したくない場合、空「””」にする。

SSHキーを生成する

それでは実際にSSHキーをssh-keygenコマンドで生成します。
なお、コメント部分は使用しているメールアドレスを指定しました。

すると対話方式でキーを生成するディレクトリの確認があります。
上記は~/.sshディレクトリにキーを生成するが問題ないか?という質問です。
大抵は問題ないと思うので、何も入力しないでENTERを押します。

次にパスフレーズの設定です。これを入力するとSSH接続する際、パスフレーズの入力が必要です。
英数字と記号を含めた10文字以上の文字列でないとうまく設定できないっぽいです。

これで「Ed25519鍵」のペアが生成できました。~/.sshディレクトリを確認します。

$ ls ~/.ssh
id_ed25519     id_rsa         known_hosts
id_ed25519.pub id_rsa.pub     m-ke

id_ed25519とid_ed25519.pubのキーがペアで生成されていることが確認できました。

ssh-agentに登録する(パスフレーズを設定した場合)

先程のSSHキーの生成でパスフレーズを設定した場合、SSH接続するごとにパスフレーズの入力が必要です。それは流石にめんどくさいので、入力を自動化します。
自動化には「ssh-agent」を使います。秘密鍵をメモリ上に保持する機能があるらしいです。

「ssh-agent」を以下のコマンドで起動します。

$ eval "$(ssh-agent)"

余談ですがevalは文字列をコマンドとして実行する機能があります。
試しにssh-agentだけを実行すると、よくわからない文字列が返ってくると思います。

evalはこの文字列をコマンドとして実行する

evalはこの文字列をコマンドとして実行します。

SSHキーをキーチェーンに登録する

「ssh-agent」を起動したら、先程生成したSSHキーを登録します。
ssh-addコマンドで登録できます。

$ ssh-add -K ~/.ssh/id_ed25519

「-K」オプションを付けると、SSHキーはキーチェーンに登録されます。Mac以外には必要ないオプションだと思われます。

こうすることでシェルやパソコンを再起動したときでもキー情報が残ります。
逆にいうと「-K」オプションがない場合、再起動する度にキーの登録が必要になります。

上記コマンドを実行すると、パスフレーズを入力するよう指示されます。
SSHキーを生成するときに設定したパスフレーズを入力すれば登録は完了です。

.ssh/configに設定する

ssh-addでキーを登録しても、MacのOSのバージョンによっては再起動でキーが消えてしまいます。
その場合、.sshのconfigファイルを以下のように設定します。
※GitHubの公式ページから引用しました。

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

Hostの「*」は全てのホストを表します。GitHubだけに限定したい時は「github.com」にします。

~/.sshディレクトリにあるconfigファイルとは

SSH経由でリモートサーバーに接続する際に利用される設定ファイルが~/.sshディレクトリにあるconfigファイルです。もしファイル自体が存在しない場合は作成します。

項目のそれぞれの意味はこちら。

項目備考
Hostホスト名を指定する。GitHubの場合「github.com」
AddKeysToAgentyes指定でssh-addと同じ意味。
UseKeychainyes指定でssh-add -Kと同じ意味。
IdentityFile接続時に使用する秘密鍵を指定

キーチェーンからパスフレーズを読み込む関係上、AddKeysToAgent、UseKeychain両方の指定が必要なようです。

GitHubに公開鍵を登録する

ローカル側の設定が完了したので、GitHubに公開鍵を登録します。

公開鍵の中身をコピーする

id_ed25519.pub(公開鍵)の中身をコピーします。
以下のコマンドでコピーできます。

$ pbcopy < ~/.ssh/id_ed25519.pub

GitHubの設定ページを開く

GitHubのサイトにサインインします。画面右上のアイコンから「settings」をクリックします。

次に「SSH and GPG keys」をクリック。

SSH Keyの「New SSH Key」をクリックします。

keyの欄に、先程コピーしたキー情報をペーストします。Titleには分かりやすい名前をつけます。
入力したら「Add SSH key」をクリックします。

これでGitHubでの設定は完了です!

GitHubにSSHで接続できるか確認する

設定が完了したので、実際にGitHubにSSH接続できるか確認します。
確認するには以下のコマンドを実行します。

$ ssh -T git@github.com

以下のような表示が出れば、GitHubにSSH接続できています。お疲れ様でした!

Hi <ユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.

ssh-agentのコマンド

最後にssh-agentのコマンドについてまとめます。

▼ssh-agent起動

$ eval "$(ssh-agent)"


▼起動しているか確認

$ ps -x | grep ssh-agent
 1097 ??         0:00.03 /usr/bin/ssh-agent -l
 1629 ttys000    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox ssh-agent

※ssh-agentがプロセス1097で起動していることが確認できる。

▼登録されているキーを確認する

$ ssh-add -L
256 SHA256:3E3K4/dH*******************/b1kLw /Users/donguri/.ssh/id_ed25519 (ED25519)

▼登録されているキーを全て削除

$ ssh-add -D
All identities removed.

まとめ

今までなんとなく使っていたSSH接続についてまとめました。
ssh-agentの登録は、コマンド、~/.ssh/config両方設定すればSSH接続できました。

一度設定したら、再度設定する必要もないので手順を忘れがちです。
忘備録としてメモしておきます。

コメント