SSHキーを作成してGitHubに登録する|ssh-keygenの手順と動作確認

「ssh-keygen for GitHub」「Ed25519 Key Setup」の文字。中央にアンバー色の大きな鍵があり、歯の部分が右の紺色のスロット板に噛み合っている。左下には同じ波形の模様を持つ2枚の水色のカードが重なり、緑のチェックが付いて一致を示している。鍵には Ed25519、カードには Fingerprint Match のラベルが添えられている 環境構築

GitHub でリポジトリをクローンしたりプッシュしたりするには、認証が要ります。HTTPS と SSH のどちらでも接続できますが、SSH なら鍵のファイルを置いておくだけで済み、操作のたびに認証情報を入力しなくてよくなります。

この記事では ssh-keygen で SSH キーを作り、公開鍵を GitHub に登録して、接続できるところまでを扱います。コマンドと画面は macOS のものです。Linux との違いは必要な箇所で添えますが、手元に環境が無く確かめられないため Windows は扱いません。

本記事のまとめ

  • 今から作るなら ssh-keygen -t ed25519 である。GitHub の公式ドキュメントはこれを本手順にしている
  • RSA 4096 は「Ed25519 をサポートしていないレガシ システム」向けの代替として案内されている。使えなくなったわけではない
  • パスフレーズは付けてよい。~/.ssh/config と ssh-agent に預ければ、接続のたびに入力を求められることはなくなる
  • 初回接続で yes と打つ前に、表示されたフィンガープリントを GitHub の公開値と突き合わせる

SSHキーをEd25519で作成する

次のコマンドを実行すると、Ed25519 の秘密鍵と公開鍵が 1 組できます。

ssh-keygen -t ed25519 -C "your_email@example.com"

-t は鍵のアルゴリズムの指定です。Ed25519 は楕円曲線を使った署名方式で、鍵のファイルが短く、生成も署名も速く終わります。

-C は鍵に付けるコメントです。公開鍵ファイルの末尾にそのまま文字列として入るので、GitHub に複数の鍵を登録したときに「どの端末の鍵か」を見分ける目印になります。メールアドレスを入れるのが慣例ですが、macbook-2026 のような端末名でも構いません。

実行すると、質問が 3 つ順番に出ます。

対話プロンプトの3つに答える

保存先は既定のまま Enter、パスフレーズは入力する、という答え方で問題ありません。

Enter file in which to save the key (/Users/<ユーザー名>/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

1 つ目は鍵の保存先です。そのまま Enter を押すと ~/.ssh/id_ed25519 になります。既定のファイル名から変えないでください。ssh は接続時に既定の名前の鍵を自動で読むため、別名にすると後から ~/.ssh/config に場所を書く手間が増えます。

2 つ目と 3 つ目はパスフレーズです。秘密鍵そのものを暗号化する合言葉で、鍵のファイルが流出しても、これが分からなければ使えません。何も入力せず Enter を押すと、パスフレーズ無しの鍵ができます。

パスフレーズを付けると接続のたびに入力を求められるため、迷う人も多いでしょう。これは後の「パスフレーズを毎回聞かれないようにする」で解消できるので、付けておいて構いません。

作成されるファイルとパーミッション

生成が終わると、秘密鍵と公開鍵の 2 つのファイルができます。手元の macOS で ls -l ~/.ssh/id_ed25519* を実行したところ、パーミッションは次のようになりました。

-rw-------  1 <ユーザー名>  staff  411 10 10 20:25 /Users/<ユーザー名>/.ssh/id_ed25519
-rw-r--r--  1 <ユーザー名>  staff  100 10 10 20:25 /Users/<ユーザー名>/.ssh/id_ed25519.pub

拡張子の無いほうが秘密鍵で、パーミッションは 600 です。所有者だけが読み書きでき、他の利用者からは見えません。このファイルは誰にも渡さないでください。GitHub にも、チャットにも、イシューにも貼りません。

.pub が付いたほうが公開鍵で、パーミッションは 644 です。こちらは人に見せて構いません。次の手順で、この中身を GitHub に貼り付けます。

Ed25519とRSAのどちらで作るか

GitHub の公式ドキュメントは Ed25519 を本手順にしていて、RSA 4096 は「Ed25519 アルゴリズムをサポートしていないレガシ システムを使っている場合」の代替として案内しています(新しい SSH キーを生成して ssh-agent に追加する)。

つまり RSA が使えなくなったわけではありません。古い踏み台サーバーや社内の機器が Ed25519 に対応していないなら、RSA を選ぶ理由があります。その場合のコマンドはこうなります。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

-b は鍵長をビット数で指定するオプションです。手元の macOS で -b を省いて RSA の鍵を作ったところ 3072 ビットになったので、4096 にしたいなら明示的に指定します。

鍵長の数字は直接比べられない

Ed25519 の鍵は 256 ビットですが、これを RSA の 4096 ビットと並べて「16 分の 1 だから弱い」と読むのは誤りです。

RSA と Ed25519 は、安全性の根拠にしている数学の問題が違います。同じ強度を得るのに必要なビット数が方式ごとに違うので、ビット数だけを並べても比較になりません。

もう 1 つ、鍵長を伸ばすことと量子計算機への耐性は別の話です。RSA も Ed25519 も、量子計算機が実用化されれば破られる種類の暗号で、ビット数を増やしても耐性は得られません。備えるには、そもそも別方式の暗号が要ります。

選び方の違いを表にまとめます。

項目Ed25519RSA 4096
コマンドssh-keygen -t ed25519ssh-keygen -t rsa -b 4096
既定のファイル名~/.ssh/id_ed25519~/.ssh/id_rsa
鍵長256 ビット4096 ビット(既定は 3072)
GitHub 公式での位置づけ本手順Ed25519 非対応の環境向けの代替
ssh-keygen -t rsa -b 4096 の実行画面。保存先とパスフレーズの入力を求められ、最後に RSA 4096 のフィンガープリントと randomart が表示されている
RSA を選んだ場合の実行画面。末尾の囲みが [RSA 4096] になる

公開鍵をGitHubに登録する

公開鍵の中身をクリップボードにコピーして、GitHub の設定画面に貼り付けます。

pbcopy < ~/.ssh/id_ed25519.pub

pbcopy は macOS のコマンドです。Linux には無いので、cat ~/.ssh/id_ed25519.pub で表示して手で選択します。

コピーされるのは、次のような 1 行です。鍵の本体は長いので省略しています。

ssh-ed25519 (鍵の本体) your_email@example.com

先頭の ssh-ed25519 が鍵の種類、真ん中が鍵の本体、末尾が -C で付けたコメントです。改行を入れず 1 行のまま貼り付けてください。

GitHub 側の手順は次のとおりです。

  1. 右上のプロフィール写真をクリックし、Settings を開く
  2. 左のサイドバーで SSH and GPG keys を選ぶ
  3. New SSH key をクリックする
  4. Title に、どの端末の鍵か分かる名前を入れる
  5. Key に、コピーした公開鍵を貼り付ける
  6. Add SSH key をクリックする
GitHub の Add new SSH Key 画面。左のサイドバーで SSH and GPG keys が選ばれ、右に Title、Key type、Key の 3 つの入力欄と Add SSH key ボタンが並んでいる
左のサイドバーが手順 1〜2 の位置、右のフォームが手順 4〜6 にあたる

登録の直前に、アカウントの確認を求められることがあります。パスワードや二要素認証の入力を促す画面が出たら、そのまま進めてください。

Key typeはAuthentication Keyを選ぶ

リポジトリの操作に使う鍵なので、Key type は Authentication Key のままにします。

もう一方の Signing Key は、コミットに署名を付けるための枠です。用途が分かれているので、同じ鍵を認証と署名の両方に使いたい場合は、同じ公開鍵を 2 回登録する必要があります。ここでは認証だけなので、1 回で済みます。

GitHubとの接続を確認する

登録できたかどうかは ssh -T git@github.com で確かめます。-T は端末を割り当てないという指定で、認証だけを試すときに使います。

ssh -T git@github.com

初回は、接続先のホストが本物かを確認する質問が出ます。

The authenticity of host 'github.com (...)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

フィンガープリントを公式の値と突き合わせる

ここで何も見ずに yes と打たず、表示された値を GitHub が公開しているフィンガープリントと突き合わせます。

フィンガープリントは、相手のホスト鍵を短い文字列に要約したものです。これを照合することで、接続先が本物の GitHub だと確かめられます。GitHub は値を公式ドキュメントで公開しています。

鍵の種類フィンガープリント
Ed25519SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
RSASHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
ECDSASHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM

私の環境で ssh-keyscan を使って github.com のホスト鍵を取得し、フィンガープリントを計算したところ、公式の値と一致しました。

ssh-keygen -lf <(ssh-keyscan -t ed25519 github.com)
256 SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU github.com (ED25519)

一致したら yes と入力します。鍵が ~/.ssh/known_hosts に記録されるので、以降この確認は出ません。認証が通ると、次のメッセージが返ります。

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

GitHub は SSH でのシェルログインを提供していないので、後半の does not provide shell access は失敗ではありません。認証だけ通ってここで終わるのが正常です。

ssh -T git@github.com の実行画面。ED25519 のフィンガープリントが表示され、yes と答えたあとに authenticated のメッセージが返っている
初回接続。表示された SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU は公式の公開値と一致している

パスフレーズを毎回聞かれないようにする

ssh-agent が要るのは、パスフレーズを付けたときだけです。ssh-agent は、復号した秘密鍵をメモリに預かっておく常駐プログラムを指します。

既定のファイル名で鍵を作っていれば、ssh は接続のたびに ~/.ssh/id_ed25519 を自動で読みます。手元の環境で ssh-add -l を実行すると The agent has no identities. が返りますが、その状態でも ssh -T git@github.com は通りました。エージェントに登録しなくても、接続自体はできます。

パスフレーズを付けた場合は、鍵を読むたびに復号が必要になるので、接続のたびに入力を求められます。これを避けるために、復号した鍵を ssh-agent に預けます。

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

ただし、これだけでは端末を閉じたりマシンを再起動したりすると預けた鍵が消えます。macOS にはこれを引き継ぐ仕組みがあります。

macOSではKeychainに預ける

macOS なら --apple-use-keychain を付けて登録し、~/.ssh/config に設定を書けば、再起動後も入力を求められません。

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

GitHub の公式ドキュメントは、あわせて ~/.ssh/config に次を書くよう案内しています。~/.ssh/config は、接続先ごとの設定をまとめておくファイルです。

Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

3 行の意味は次のとおりです。

  • AddKeysToAgent yes: 使った鍵を自動で ssh-agent に登録する
  • UseKeychain yes: パスフレーズを macOS の Keychain に保存し、次回から読み出す
  • IdentityFile ~/.ssh/id_ed25519: この接続先で使う鍵を指定する

UseKeychain は macOS だけの設定です。Linux では書かず、ssh-add も --apple-use-keychain を外して実行してください。

つながらないときに見るところ

認証が通らないときは Permission denied (publickey) が返ります。原因はおおむね 4 つです。

  1. 鍵が ssh-agent にも既定のファイル名にも無い
  2. 公開鍵を GitHub に登録していない
  3. リモート URL が HTTPS のままになっている
  4. sudo を付けて git を実行している

1 と 2 は、ssh がどの鍵を試したかを見れば切り分けられます。-v を付けると接続の過程が出るので、読み込まれた鍵のパスを追ってください。

ssh -vT git@github.com
ssh-add -l -E sha256

3 はリポジトリ側の設定です。鍵を登録しても、リモート URL が https:// で始まっていれば SSH は使われません。

git remote -v
git remote set-url origin git@github.com:<ユーザー名>/<リポジトリ名>.git

4 は sudo の使い方です。sudo git ... と実行すると root のホームディレクトリが使われるため、自分の ~/.ssh に置いた鍵は読まれません。GitHub の公式ドキュメントも、git で sudo や管理者権限を使わないよう案内しています。

まとめ

SSH キーは ssh-keygen -t ed25519 -C "メールアドレス" で作り、公開鍵を GitHub に登録すれば使えるようになります。

  • RSA 4096 は、Ed25519 に対応していない機器を相手にするときの代替として残しておく
  • パスフレーズは付けてよい。~/.ssh/config と ssh-agent に預ければ、入力は初回だけで済む
  • 初回接続のフィンガープリントは、公式の公開値と突き合わせてから yes と打つ
  • つながらないときは ssh -vT git@github.com と git remote -v の 2 つから見る

鍵を手元に置かずに GitHub から各クラウドへ認証する方法もあります。GitHub Actions から Google Cloud へつなぐ構成はWorkload Identity FederationでGitHub ActionsからGoogle Cloudへ認証するにまとめました。

なお、GitHub の管理画面の構成と、公開されているフィンガープリントの値は変わります。実際に設定するときは、最新を公式ドキュメントで確認してください。