おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

GitHubにSSHで接続する

前回のブログで、ローカルのgitとGitHubとでHTTPSプロトコルを使って通信する方法を書きました。 SSHプロトコルを使う方法もあります。 今回はそれを話題に取り上げたいと思います。

この記事を読む前に注意していただきたいこと

会社のコンピュータなどの場合、インターネットと社内ネットワークの間にプロキシサーバーが置かれている場合が多いです。 プロキシサーバーの中にはSSHの通信を禁止している場合があります。 具体的には、SSHサーバーはポート番号22を使うので、プロキシがポート22への通信を破棄すればSSH通信を禁止できます。 この場合はポート22でGitHubへのSSH接続はできませんが、ポート443でもGitHubSSH接続できます。

Using SSH over the HTTPS port

このことを使ってGitHubSSH接続する情報を見つけました。

httpプロキシサーバがわかればGitHubは使える

ただし、私の方では動作確認は取れていません。

とにかく、プロキシがある場合は面倒なことになります。 以下では、プロキシがない場合(個人でプロバイダーを通してインターネットに接続する場合など)を説明します。

SSHについて

SSHは、2台のコンピュータがネットワークを通してデータを暗号化して通信するためのプロトコルです。 主にサーバにリモート・ログインして使うのに用いられますが、GitHubとGitの通信でも使えます。

情報の暗号化には「公開鍵」と「秘密鍵」を使います。 公開鍵と秘密鍵についてはウィキペディアに説明があります。

簡単に説明すると、

  • 秘密鍵は自分の手元に置いておく
  • 公開鍵は誰でも取得することができる
  • 公開鍵でデータを暗号化したものは秘密鍵で元のデータに復元できる
  • 秘密鍵でデータを暗号化したものは公開鍵で元のデータに復元できる
  • 公開鍵で暗号化したデータを公開鍵で元に戻すことはできない。秘密鍵も同様。

AがBに暗号化したデータを送るとき、万一B以外がその暗号データを手に入れても、復号できないために

Aが(Bの作成した)公開鍵で暗号化し、Bはそれを(Bの作成した)秘密鍵で元のデータに戻す

という方法が取られます。 秘密鍵と公開鍵の使い方を逆にすると誰でも解読できてしまうので注意が必要です。 (そういう使い方は別の意味で有効なことがありますが)

このことから、GitHubを使っているユーザをAさんとすると

  • AさんがGitHubからデータをダウンロードするときには、GitHubがAさんの公開鍵で暗号化しAさんは(Aさんの)秘密鍵で復元する
  • AさんがGitHubにデータをアップロードするときには、AさんがGitHubの公開鍵で暗号化してGitHubは(GitHubの)秘密鍵で復元する

ということになります。 したがって、データのやり取り以前に公開鍵を相手に伝えておくことが必要になります。

GitHubのドキュメントに、SSHを使ったGitとGitHubの通信の設定方法が書かれています。 これを読みながら設定することをお勧めします。

鍵の生成

鍵の生成にはssh-keygenというコマンドを使います。

$ $ ssh-keygen -t ed25519 -C "ユーザのemailアドレス"

ed25519は暗号化の方式です。 ウィキペディアエドワーズ曲線デジタル署名アルゴリズムに説明があります。

Enter a file in which to save the key

というプロンプトに対しては単にエンターキーを押せば良いです。

Enter passphrase (empty for no passphrase)

というプロンプトに対してはパスフレーズを入力します。 パスフレーズはパスワードのようなものです。 後で使うので控えておかなければなりません。

これで、~/.ssh/に公開鍵「id_ed25519.pub」と秘密鍵「id_ed25519」が生成されます。

ssh-agentをバックグラウンドで走らせ、秘密鍵を登録します

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

ここで行った手続きの詳細についてはOpenSSHのウェブサイトを参照してください。

GituHubへの公開鍵登録

作成した公開鍵をGitHubに登録します。 GItuHubのドキュメントも参考にしてください。

  • GItHubをブラウザで開きサインインする
  • 右上のアイコン(プロフィールアイコン)をクリックしポップアップメニューから「Settings」をクリックする
  • 左側の列のメニューから「SSH and GPG Keys」をクリックする
  • 右側の一番上SSH Keysの「New SSH Key」ボタン(緑のボタン)をクリック
  • タイトルフィールドには、キーのタイトル、例えば「〇〇のデスクトップマシン」のようなメモを入力する
  • ローカルのコンピュータの公開鍵「id_ed25519.pub」をエディタで開き、キーをクリップボードにコピーする。 (重要な注意)秘密鍵と間違わないでください
  • ブラウザ画面のKeyのところにペーストする
  • 「Add SSH Key」ボタンをクリックする

Gitのリモート・アドレスの変更

GitHubからクローンしたときにHTTPSを選んでクローンしていた場合は、アドレスをSSH用に変更しなければなりません。 今後クローン時には「HTTPS」でなく「SSH」を選んでください。 以下に例を示します。

$ git remote -v
origin  https://github.com/ToshioCP/jekyll-tutorial-for-beginners.git (fetch)
origin  https://github.com/ToshioCP/jekyll-tutorial-for-beginners.git (push)
$ git remote set-url origin git@github.com:ToshioCP/jekyll-tutorial-for-beginners.git
$ git remote -v
origin  git@github.com:ToshioCP/jekyll-tutorial-for-beginners.git (fetch)
origin  git@github.com:ToshioCP/jekyll-tutorial-for-beginners.git (push)

「get remote -v」はリモートの一覧を表示します。 上の例では「origin」つまりGitHubが唯一のリモートです。 「git remote set-url (リモート名)(アドレス)」はリモートアドレスを変更します。 「git@」で始まるアドレスはSSH通信でのGitHubのレポジトリアドレスです。

ここまでで、SSH通信の準備ができました。

GitからSSHGitHubにアクセスする

最初にGItHubからデータを受け取るときに、GitHubの公開鍵を持っていないとデータの復号ができません。 では、公開鍵はいつどうやって手に入れるのでしょうか。 公開鍵は最初にGitHubからデータを入手するときに送信されてきます。 その公開鍵が正しいものかどうかはこの時点ではわかりません。 そこでメッセージが現れ、その公開鍵のフィンガープリント(fingerprintは指紋という意味)が表示されます。 フィンガープリントはGitHubで公開されています。

このフィンガープリントとパソコンに表示されたフィンガープリントが一致するかどうか確認します。 一致していれば正しいGItHubの公開鍵が送られてくることになります。 「yes」を入力すると公開鍵がローカルに取り込まれます。

これから先は以前と同様、「git clone」「git pull」「git push」などでアクセスできます。

公開鍵は通信の開始時に交換され相手を認証します。 公開鍵はすでに互いが持っているので、それと送られてきた公開鍵を比較することによって相手を確認するわけです。 ですから、仮にGitHubが公開鍵を変更すると、送られてきた公開鍵はローカルに持っている公開鍵と違いますから、先程のフィンガープリントがまた表示され、確認を求められることになります。

以上、HTTPSからSSHに変更する流れを見てきました。 SSHを使えばいちいちユーザ名やパスワードを求められることがないのでプッシュが楽になります。

次回はまたGitHub pagesとJekyllの話に戻ります。