GitHubヘルプを参考にSSHキーの設定を行ってみた

今回はssh-agentを使うのでニッチな方法かも知れませんが、「こんな方法もあるんだなぁ」くらいで見てもらえればと思います。
2020.04.26

こんにちは、CX事業本部の若槻です。

今回は、Gitコマンドの実行でGitHubとのSSH認証ができるように、GitHubヘルプの手順を参考にしてSSHキーの設定を行ってみました。

SSHキーの設定を行ってみた

[GitHub に SSH で接続する - GitHub ヘルプ]の以下の手順を参考にSSHキーの設定を行っていきます。

  1. 既存の SSH キーの確認
  2. 新しい SSH キーを生成する
  3. SSH キーを ssh-agent に追加する
  4. GitHub アカウントへの新しい SSH キーの追加
  5. SSH 接続をテストする

既存の SSH キーの確認

まず、「1. 既存の SSH キーの確認」を参考に、GitHubの既存のSSHキーがローカル側に存在するか確認を行います。

コマンドls -al ~/.sshを実行します。

$ ls -al ~/.ssh

ディレクトリの一覧から、公開SSHキーがすでに作成済みであるか確認します。 デフォルトでは、公開鍵のファイル名は以下のいずれかです。

  • id_rsa.pub
  • id_ecdsa.pub
  • id_ed25519.pub

公開鍵と秘密鍵のペアが存在しないか、既存の鍵をGitHubへの接続に利用したくない場合、新しいSSHキーを作成します。

一覧に既存の公開鍵と秘密鍵のペア (id_rsa.pubid_rsaなど) があり、それをGitHubへの接続に利用したい場合、SSHキーをssh-agentに追加します。

新しい SSH キーを生成する

「2. 新しい SSH キーを生成する」を参考に、ssh-keygenコマンドを利用して新しいSSHキーを生成します。

コマンドssh-keygen -t rsa -b 4096 -C "<自分のGitHubメールアドレス>"を実行します。公開鍵のコメントに指定のメールアドレスを含む新しいSSHキーが作成されます。

$ ssh-keygen -t rsa -b 4096 -C "<自分のGitHubメールアドレス>"
> Generating public/private rsa key pair.

「Enter a file in which to save the key」というメッセージが表示されたら、プロンプトでEnterキーを押します。デフォルトで/home/you/.ssh/id_rsaというパスでキーのファイルが作成されます。

> Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]

プロンプトで安全なパスフレーズを入力します。

> Enter passphrase (empty for no passphrase): 
> Enter same passphrase again:

コマンドls -al ~/.sshを実行すると、~/.sshディレクトリ配下に公開鍵id_rsa.pubと秘密鍵id_rsaのファイルが作成されていることが確認できます。

SSH キーを ssh-agent に追加する

「3. SSH キーを ssh-agent に追加する」を参考に、作成したSSHキーのssh-agentへの追加を行います。

バックグラウンドでssh-agentを開始します。

$ eval "$(ssh-agent -s)"

ssh-add ~/.ssh/id_rsaを実行して、SSH秘密鍵をssh-agentに追加します。

$ ssh-add ~/.ssh/id_rsa

GitHubアカウントへの新しいSSHキーの追加

「4. GitHub アカウントへの新しい SSH キーの追加」を参考に、作成したSSHキーをGitHubアカウントに追加を行います。

まず、作成したSSH公開鍵id_rsa.pubの中身をクリップボードにコピーします。xclip -sel clip < ~/.ssh/id_rsa.pubコマンドなどで直接クリップボードにコピーするか、エディターなどで開いてコピーします。

[https://github.com/settings/keys]にアクセスして「SSH and GPG keys」ページを開きます。[New SSH key] (または [Add SSH key]) をクリックします。 image.png

[Title]フィールドで任意のキータイトルを入力し、[Key]フィールドで先ほどコピーした公開鍵の中身をペーストして、[Add SSH key]をクリックします。 image.png

GitHubのパスワードを要求された場合は確認します。

[SSH Keys]のキー一覧で追加したSSHキーが表示されれば追加は成功です。 image.png

SSH接続をテストする

「5. SSH 接続をテストする」を参考に、GitHubへのSSH接続のテストを行います。

コマンドssh -T git@github.comを実行して、GitHub(git@github.com)へのSSH接続を行います。

$ ssh -T git@github.com

以下のプロンプトメッセージが表示されたらyesを入力してEnterを押します。

> Are you sure you want to continue connecting (yes/no)?

以下のように表示されて自分のGitHubユーザー名(usernameの箇所)が確認できたらテストは成功です。

> Hi username! You've successfully authenticated, but GitHub does not
> provide shell access.

SSHキーの設定はこれで完了です。この状態で例えばプライベートリポジトリに対してgit cloneコマンドを実行すれば、以下のように問題なくクローンできるはずです。

$ git clone git@github.com:username/repository.git
Cloning into 'repository'...
Warning: Permanently added the RSA host key for IP address 'IP Address' to the list of known hosts.
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 31 (delta 5), reused 14 (delta 1), pack-reused 0
Receiving objects: 100% (31/31), 4.21 KiB | 4.21 MiB/s, done.
Resolving deltas: 100% (5/5), done.

ssh-agentを使ったSSH接続について

今回はssh-agentにSSH秘密鍵を保持する設定を行いました。このssh-agentが起動しているあいだは、gitコマンド実行時にssh-agentがSSHキーの受け渡しを自動で行ってくれるようになります。

ssh-agentが起動しているかはssh-add -lコマンドで確認できます。実行して以下のようにSSHキーの情報が表示されれば起動しています。

$ ssh-add -l
4096 SHA256:xiV540/OYAMYE7h4cbzCFINn6pAtRjM+a53Dh6dPP1k /home/ec2-user/.ssh/id_rsa (RSA)

一方で以下のように表示されたらssh-agentは起動していません。

$ ssh-add -l
Could not open a connection to your authentication agent.

この状態でgitコマンドを実行しても認証は失敗します。

$ git clone git@github.com:username/repository.git
Cloning into 'repository'...
Enter passphrase for key '/home/ec2-user/.ssh/id_rsa': 
Received disconnect from IP Address port 22:11: Bye Bye
Authentication failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

よって、作業開始時にssh-agentが毎回実行されるように、.bash_profile.bashrcファイルにeval "$(ssh-agent -s)"コマンドを追記すると良いかと思います。

しかし、それでもGitコマンド実行時の認証ごとに「Enter passphrase for key '/home/ec2-user/.ssh/id_rsa': 」のようにプロンプトが出てパスフレーズ入力は求めれらるので、それも避けたいのであれば以下の記事のようにパスフレーズを設定せず~/.ssh/configを設定する方法を利用することも考えられます。

HTTPSを使うことも検討しよう

そもそもGitHubとしては以下ページにあるようにSSH接続ではなくHTTPS接続による方法が推奨されています。プロジェクトなどで特段の制限や方針がなければHTTPSを使うことを検討しましょう。

HTTPS接続の設定は以下のGitHubヘルプのページが参考になります。

参考