Proxy環境下でのRubyGems

Visual Studio(2005, 2008)をRubyのIDEのエンジンとして利用する画期的な開発環境である、Ruby In Steelを試してみようと思い、Zipファイルを展開してインストールを始めたのだが、gemによるRailsのgetで止まってしまい、次に進まない。

Updating RubyGems...
ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。ま
たは接続済みのホストが応答しなかったため、確立された接続は失敗しました。 - connect(2)(Errno::ETI
MEDOUT)

なんだこりゃ、と思いつつもよく考えたら会社のPCはネットワーク統合後、インターネットにはプロキシ経由でしか通らないんだった。こりゃgemのネットワーク設定をいじる必要がありそうだ。

といいつつもさっぱり解らないので本家で調べてみた。
RubyGems - gem Command Reference
  3. Configuration File
GEM_HOMEに設定ファイル(.gemrc)を置くか、環境変数を設定してコマンドを発行するかの選択らしいが、まずはgemがプロキシ認証を超えられるかを試してみるためにコマンドを使ってみることにした。

プロキシを介してgemを実行するには-pオプションを使用してプロキシに接続するためのURIを記述する。必要であれば認証情報をURIに埋め込むことができる。(パスワードが丸見えなので、一時的な方法に済ませるべきだろう)

gem list rails -r -p http://<ユーザ>:<パスワード>@<プロキシのホスト名>:<ポート>

ERROR:  While executing gem ... (NoMethodError)
    undefined method `[]=' for #

早速失敗だし。
んん? '='メソッドが無いってどういうことよ、と調べて見たのだが、これはRubyGems(1.0以前)のバグらしく、最新にアップデートするか又は以下のように=メソッドを追加することで回避できる。

    def []=(key, value)
      @hash[key] = value
    end

ちょっと怖いけど、スクリプトはビルドとかいらないので、パッチ当ても楽だな。

気を取り直してもう一度実行すると、今度は

gem list rails -r -p http://<ユーザ>:<パスワード>@<プロキシのホスト名>:<ポート>
*** REMOTE GEMS ***
ERROR:  While executing gem ... (Gem::RemoteSourceException)
    HTTP Response 407

407ということは認証情報が渡っていないのだろうかと思って調べると、今度はRuby1.8のOpenURIモジュールのバグらしい。

open-uri.rb 407 Proxy Authentication Required (OpenURI::HTTPError)
こちらも、open-uri.rb中の一行(私の使っているバージョンでは216行目)を書き直すことでFIXすることができる。

215  if proxy
216    klass = Net::HTTP::Proxy(proxy.host, proxy.port, proxy.user, proxy.password)
217  end

今度こそーーーーと思ったのだが、

gem list rails -r -p http://<ユーザ>:<パスワード>@<プロキシのホスト名>:<ポート>
*** REMOTE GEMS ***
ERROR:  While executing gem ... (URI::InvalidURIError)
    bad URI(is not URI?): http://<ユーザ>:<パスワード>@<プロキシのホスト名>:<ポート>

一筋縄ではいかんな。今度はURIがダメらしい。
ここまで書いていなかったのだが、実はプロキシの認証に使用している「ユーザ」とはWindowsドメインユーザである。
Windowsネットワーク環境でRubyGemsからプロキシサーバの認証を通す場合はちょっと工夫が必要なようで、こんな情報があったので、ruby用のsspiライブラリィ(rubysspi-1.2.4.gem)をインストール、リンクにあるようにコマンドを書き換えて再実行してみた。

gem list rails -r -p http://<ユーザ>:<パスワード>@<プロキシのホスト名>:<ポート>
*** REMOTE GEMS ***
ERROR:  While executing gem ... (RuntimeError)
    Error occurred during proxy negotiation. req: "NTLM TlRMTVNTUAAXXXXXXXXXXXAB
BBBBBBBbbAAAAAAAAAAGAHEXAAAADw=="; res: #<Net::HTTPProxyAuthenticationRequired 4
07 Proxy authentication required readbody=true>; Original message: Error: SEC_E_INVALID_TOKEN

.............
どんどんと深みに嵌っていっている気がするが、どうやらアカウント情報はNTLM認証を介してサーバに渡されているぽい。

Windowsのプロキシサーバのある環境でリモートのgemをインストールしたいだけなのだが、そもそもWindowsのドメインユーザアカウントをrubyから使う、なんてこと自体やっちゃ駄目なことなのだろうか。


....あれ、俺ってば元々何をしたかったんだっけか。


追記:
似た事例がrubyforgeに上がっていたぞ。
cannot use rubysspi with NTLM proxy server
BASIC認証とNTLM認証を取り違えているのか?