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が生成される。 |
-C | SSHキーにコメントを追加する。 指定しない場合、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はこの文字列をコマンドとして実行します。
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」 |
AddKeysToAgent | yes指定でssh-addと同じ意味。 |
UseKeychain | yes指定で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接続できました。
一度設定したら、再度設定する必要もないので手順を忘れがちです。
忘備録としてメモしておきます。
コメント