Skip to the content.

第10章 GitをSSHで使う方法

チュートリアルの最後にGitをSSHでリモートと繋ぐ方法を説明します。 これはJekyllからは離れた内容ですが、GitはJekyll、GitHubと切り離せない内容ですので取り上げました。 Appendix的な内容になります。

今までこのチュートリアルではgitとGitHubをHTTPSプロトコルで繋げてきました。 HTTPSの他にSSHプロトコルを使う方法もあります。 今回はそれを取り上げます。

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

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

Using SSH over the HTTPS port

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

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

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

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

SSHについて

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

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

簡単に説明すると、

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

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

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

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

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

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のドキュメントも参考にしてください。

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)

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

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

GitからSSHでGitHubにアクセスする

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

https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints

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

これから先は以前と同様、「git clone」「git pull」「git push」などでアクセスできます。 データの暗号化、復号はGitがやるので、ユーザは何もする必要はありません。

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

なお「git push」するときに、秘密鍵へのアクセスのために、パスフレーズの入力を求められます。 秘密鍵作成時に設定したパスフレーズを入力してください。 一度入力するとそのセッションが続いている間は再入力の必要はありません。

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