プロキシ経由などhttpしか使えない環境でSSHと鍵を使ってGitHubにpushする方法

学校や会社などproxyを通してしかインターネットに接続できない環境で、GitHubにpushする最善の方法を模索して満足できる方法が見つかったのでメモします。Windowsの環境にだけしぼった方法ですがBK山盛りです。

問題・課題

  • そもそもリモートのgit操作ができるかどうか
  • http経由だと認証関係で色々と面倒くさかったり・生認証データの問題がある
  • gitはhttpプロトコル経由よりgit(SSH)プロトコルの方が色々と便利(らしい)
  • 普段の操作でプロキシの有無を意識したくない

プロキシ環境(http通信限定)でのgit操作

「httpでgitのremoteリポジトリと通信できるか?」は、gitの仕様では可能です。
但しリモートの環境でhttpが使えるようにセットアップしてある必要があります。

githubは使える事が確認済み。

認証方法

http通信だと認証方式がBasic認証になります。
Basic認証だとid:thincaさんが絶望しているような状況が発生するので、なんとか回避したく色々と調べたところgithubでは「ssh.github.com:443」でsshの鍵を使った認証ができるように提供していることがわかりました。

次の例はプロキシがない環境でPuTTYで接続する通常のssh接続です。

【セッション】

  • ホスト名:ssh.github.com
  • ポート:443
  • 接続の種類:SSH
  • 鍵の読み込み(pagentもしくは接続→SSH→認証)
login as:git #ユーザー名はgitを入力
Server refused to allocate pty
Hi guyon! You've successfully authenticated, but GitHub does not provide shell access.

一瞬だけ上記の表示がされてコンソールが終了します。
ユーザー名「git」は全ユーザ共通で、鍵でユーザの認識しています。
鍵はプロジェクトおよびアカウント画面で重複した登録ができないので、ユニーク性を確保したという感じでしょうか?

GitでPuTTYセッションを使う

次にgitプロトコルで上記認証方法を利用する場合です。
Gitはsshを使って鍵認証をしています。ssh接続でPuTTYセッションを使いたいと思います。
msysGitを使っている場合はインストール時に「SSHはOpenSSHを使う?それともplinkを使う?」という選択があったと思います。
あと、Gitは「GIT_SSH」という環境変数で使用するSSHプログラムを決めているので、この環境変数を変更してあげれば使用するSSHプログラムを変更できます。

plinksshコマンドライン接続用ツールです。PuTTYのセッションも使用することができます。
TortoiseSVNでも使用(同梱)されています。

「システムのプロパティ」の「システム環境変数」にPuTTYに同梱されているplnkを指定します。

GIT_SSH => C:\puttypath\plink.exe

msysGitを使用している場合は「C:\Program Files\Git\setup.ini」を変更するだけでいけるかも

[Environment]
GIT_SSH=C:\puttypath\plink.exe

ここでBK登場です。

plinkはごった煮版を使用した場合、下記のようなエラーが発生してきちんとpushできませんでした。
理由はわかりません。知っている方がいたら教えてください…

Unable to read from standard input
fatal: The remote end hung up unexpectedly

この情報がヒントになりました

JSR 168 and JSR 286 Portlet Development Blog - News, Articles, Tutorials, Tips, Tricks and Hints
http://portletwork.blogspot.com/2009/01/problem-with-git-on-windows.html

plinkPuTTYのサイトからダウンロードしてリネームして使いました。環境パスで設定した名前もあわせて変更します。

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

もう一個plinkまわりではまったポイントがありました。
いつもはごった煮版PuTTYを使っていてiniファイルを使ってセッションを管理しているのですが、その場合は一度iniファイルをバックファイル化してレジストリにセッションを作る必要があります。iniファイルを使う機能はごった煮版の独自機能なので本家plinkの場合はセッションの記録先を使い分ける必要があります。

プロキシ用のセッションを作成

環境の準備が整ったら、plinkで読み込むセッションをPuTTYで作成します。

【セッション】

  • セッション
    • セッション名:gitproxy
    • ホスト名:ssh.github.com
    • ポート:443
    • 接続の種類:SSH
  • プロキシ(接続→プロキシ)
    • Proxyのタイプ:HTTP
    • Proxyのホスト:your_proxy_hostname(例:192.168.0.99)
    • ポート:your_proxy_portnumber(例:8888)
  • 鍵の読み込み(pagentもしくは接続→SSH→認証)

この作ったセッション名をgitプロトコル接続時に指定するので覚えておきます。

cloneとpush

git clone git@gitproxy:guyon/configs.git
git push

gitproxyがセッション名になります。
これでcloneとpushができるはずです。

調べている過程でPuTTYセッションを使った方法以外にも色々な方法があったので、自分にあった方法で設定をするといいと思いました。

追記 2009/2/6

セッション名が間違っていたのを修正しました。