GitHubとGitLabにSSH鍵を登録する方法

4 min read読了の目安(約4300字 2

N 番煎じの内容でごめんなさい

基本的な操作手順

  1. コマンドラインを使って 🔒 公開鍵/🔑 秘密鍵のペアを作成
  2. GitHub/GitLab に 🔒 公開鍵を登録する
  3. ローカルのssh-agentに 🔑 秘密鍵を登録する
  4. おまけ:リモートサーバに 🔒 公開鍵を登録する

参考ドキュメント

🔒 公開鍵/🔑 秘密鍵のペアを作成

  • ssh-keygen : 持っている機器ごとに公開鍵/秘密鍵のペアを生成する
  • -t ed25519 : 暗号化の方式。ググってみると ED25519 のほうが RSA より強いらしい
  • -C コメント : なくてもよい。僕は"機器の名前(メールアドレス)"とつけるようにしている
$ ssh-keygen -t ed25519 -C "コメントを入力する"
Enter file in which to save the key (~/.ssh/id_ed25519):  ## デフォルトのパスを使わない場合は、入力する
Enter passphrase (empty for no passphrase):  ## マスターパスワードを設定する
Enter same passphrase again:
Your identification has been saved in ~/.ssh/id_ed25519.    ## 🔑 秘密鍵のパス
Your public key has been saved in ~/.ssh/id_ed25519.pub.    ## 🔒 公開鍵のパス
The key fingerprint is:
SHA256:文字列 コメント
The key's randomart image is:
+--[ED25519 256]--+
|  省略            |
|    省略          |
|      省略        |
|        省略      |
|  省略            |
+----[SHA256]-----+

このマスターパスワードは、GitHub/GitLab のログインパスワードとは関係ないので、好きなパスワードを設定します

  • 鍵が生成されたことを確認する
$ ls ~/.ssh/
id_ed25519      ## 🔑 秘密鍵;🙅 絶対に外に公開してはダメなファイル
id_ed25519.pub  ## 🔒 公開鍵;外部サービスに登録するファイル

公開鍵をコピーする

  • コマンドラインを使って公開鍵の内容をクリップボードにコピーする
$ pbcopy < ~/.ssh/id_ed25519.pub

公開鍵 🔒 のファイルをエディタで直接開いて全部コピーでもいいのかもしれませんが、うっかり編集/変更してしまうのがコワイので、コマンドラインで実行するようにしています

GitHub/GitLab に 🔒 公開鍵を登録

ブラウザで GitHub/GitLab にログインして操作します

GitHub に 🔒 公開鍵を登録

  • Settings > SSH and GPG keys > New SSH key
    • Title : この鍵に関する情報を入力
    • Key : クリップボードの内容をペーストする
    • Add SSH key

GitLab に 🔒 公開鍵を登録

  • Settings > SSH Keys
    • Key : クリップボードの内容をペーストする
    • Title : この公開鍵に関する情報を入力
    • Expired at : 有効期限があれば設定する
    • Add key

TitleKeyの内容は、あとで編集することができません。
内容を間違えてしまった場合は、該当の項目を一旦削除して、New SSH keyからやりなおせば OK です。

リポジトリにプッシュする

  • リポジトリを利用するときはマスターパスワードを入力すれば OK
$ git push
Enter passphrase for key '~/.ssh/id_ed25519':
Everything up-to-date
  • ここまで設定を終えても OK

毎回マスターパスワードを入力するのは面倒なので、次のssh-agentを設定します。
次のssh-agentの設定と、この GitHub/GitLab の設定は、順番を入れ替えても OK です。

ssh-agent に秘密鍵を登録する

  • ここまでの設定だとリポジトリ操作をするたびにマスターパスワードの入力が必要
  • ssh-agentを設定して、パスワード入力を省略する
ssh-add
## 🔑 秘密鍵を登録する
$ ssh-add -K ~/.ssh/id_ed25519
Enter passphrase for ~/.ssh/id_ed25519:
Identity added: ~/.ssh/id_ed25519

## 登録内容の確認
$ ssh-add -l
256 SHA256:文字列 コメント (ED25519)
  • ~/.ssh/configに下記の内容を追記する
~/.ssh/config
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_e25519
  • リポジトリにpushしてパスワード入力が省略されることを確認する
$ git push
Everything up-to-date

おまけ:リモートサーバに公開鍵を登録する

複数のリモートサーバを扱う場合には、すべてのリモートサーバに同じパスワードを設定しがちだと思います(というか僕はしていました)。この設定をすると、リモートサーバごとにパスワードを変えながら、1 つのマスターパスワードでログインすることができるようになります。

  • ssh-copy-idを使ってリモートサーバに 🔒 公開鍵をアップロードする
    • -i ~/.ssh/id_ed25519.pub : アップロードする 🔒 公開鍵のパス
    • 🔒 公開鍵の内容は、リモートサーバ上の~/.ssh/authorized_keysに追記される
公開鍵を新規に登録する
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub アカウント名@リモートサーバ
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "~/.ssh/id_ed25519.pub"
...(省略)...
アカウント名@リモートサーバ's password:    ## リモートサーバのログインパスワードを入力

Number of key(s) added:        1
...(省略)...
  • ssh-copy-idは追記形式なので、1 つリモートサーバに複数の公開鍵登録することができる
  • 公開鍵がすでに登録されていた場合も教えてくれるので安心
公開鍵がすでに登録されていた場合
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub アカウント名@リモートサーバ
...(省略)...
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)

さらにおまけ:SSH 接続を簡単にする

  • リモートサーバの SSH 接続を簡単にする設定を~/.ssh/configに追記する
  • SSH 接続先が複数ある場合や、サーバー名が長い場合にはとても便利
~/.ssh/config
Host エイリアス
HostName リモートサーバ
User アカウント

公開鍵暗号のしくみ:🔒🔑

  • 公開鍵は 🔒(錠;ロック) 、秘密鍵は 🔑(鍵;キー)というイメージ
  • 「僕とデータをやりとりするときには、この 🔒 を使って錠をかけてね」というように使うので、🔒 は外部に配っても OK
  • 🔒 を開けるための 🔑  を持っている人だけがデータを開封することができる
    • なので 🔑 は外部に公開してはいけない
    • 🔑 を使い回すのもよくないので、機器ごとにそれぞれ生成する

この 🔒 と 🔑 の例えは、ずっと前に公開鍵暗号の仕組みに関して調べたときに、いくつか解説記事を読み一番納得できた例えでした。