Windows Ruby Gemのインストール時SSLサーバーの接続拒否問題を回避する

ホームページを制作する際の方法論が大きく変化しつつある状況に対応するためにCSSの記述を効率化すべく SassSyntactically Awesome Style Sheets) をWindows XP機と言う非力な機体にインストールする模様をレポートしたのが 本ブログの昨日2013年11月1日の記事 ホームページ制作のパラダイム変化に備えWindows XP機にRuby2.0をインストールする でした。 Synthetic ruby 其処ではSassの必要環境としてプログラミング言語 Ruby の最新版をインストールしたのでしたが、今回は愈々本来の目的であるSassのインストールの模様を記しおきます。

RubyGemsのアップデート

SassはRubyに依存するプログラムです。 従ってRubyを事前にインストールしたのでしたが、此れに依ってRubyに依存するソフトウェアをインストールするのに RubyGems が利用出来るようになりました。 一般にgemとも呼び習わされる此れはRubyのパッケージ管理システムであり、 コマンドを打ち込むだけで登録されたRuby依存のプログラムもよしなに計らいインストールしてくれます。 手元の環境のgemのバージョンを確認してみます。

スポンサーリンク
C:¥Documents and Settings¥Tsukamotch>gem -v 2.0.3

此れを最新版にアップデートします。

C:¥Documents and Settings¥Tsukamotch>gem update --system
Updating rubygems-update
Fetching: rubygems-update-2.1.10.gem (100%)
Successfully installed rubygems-update-2.1.10
Parsing documentation for rubygems-update-2.1.10
Installing ri documentation for rubygems-update-2.1.10
Installing darkfish documentation for rubygems-update-2.1.10
Installing RubyGems 2.1.10
RubyGems 2.1.10 installed
Parsing documentation for rubygems-2.1.10
Installing ri documentation for rubygems-2.1.10
...(略)
RubyGems system software updated

再びバージョンを確認します。

C:¥Documents and Settings¥Tsukamotch>gem -v 2.1.10

Sassをインストールしようとして発生した問題

これで適切なコマンドを打ち込めばSassがインストールされる筈です。 早速打ち込んでみます。

C:¥Documents and Settings¥Tsukamotch>gem install sass
ERROR: Could not find a valid gem 'sass' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (
https://rubygems.global.ssl.fastly.net/quick/Marshal.4.8/sass-3.2.12.gemspec.rz)

赤字に部分に見られる様にエラーが出力されてインストール出来ません。 ネット上にどの情報を見ても此処で躓いている記事は見当たりませんので、 正直困惑したのですが、同じく赤字で記したようにSSL接続に問題があるのは何となく分かります。 SSLに問題点を絞って解決策を検索に求めれば 丁度Sassインストール時の問題点をまとめた記事 〔※1〕 があり、12項目目の 【追記】インストールをする際にSSLエラーになる が該当しますのでセキュアでないサーバーURLをダウンロード先に加える方法を試してみました。

C:¥Documents and Settings¥Tsukamotch>gem source -a http://rubygems.org/
https://rubygems.org is recommended for security over http://rubygems.org/
Do you want to add this insecure source? [yn] y
http://rubygems.org/ added to sources
C:¥Documents and Settings¥Tsukamotch>gem install sass
ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError)
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certif
icate verify failed (https://rubygems.global.ssl.fastly.net/quick/Marshal.4.8/sa
ss-3.2.12.gemspec.rz)

しかし矢張りSSLに起因するらしいエラーが出力されインストール出来ません。 ただエラー内容が少し異なり RemoteFetcher と出力されてもますので、此れに因を求めて検索するとProxyが通ってない場合の症状とある記事 〔※2〕 もありましたので其れに縋って以下を試してみました。

C:¥Documents and Settings¥Tsukamotch>set http_proxy=http://127.0.0.1:80
C:¥Documents and Settings¥Tsukamotch>gem install sass
ERROR: Could not find a valid gem 'sass' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - Errno::ECONNREFUS
ED: No connection could be made because the target machine actively refused it.
- connect(2) (https://rubygems.org/latest_specs.4.8.gz)
Unable to download data from http://rubygems.org/ - Errno::ECONNREFUSE
D: No connection could be made because the target machine actively refused it. -
connect(2) (http://rubygems.org/latest_specs.4.8.gz)

其れでも矢張りgemでsassをインストールしようとすると 形を変えてエラーが出力され、此の方面での解決は直ぐ様諦め、 プロクシ設定を削除するためコマンドプロンプトを再起動しました。

其れならばと次に試したのがエラー出力に表示される
http://www.acenumber.com/ruby/sass-3.2.12.gemspec.rz
をダウンロードして直接インストールをすれば宜しかろうと言うもので、 以下の書式を参考に手持ちのサーバーにアップロードして 幾つかコマンド式を作成して試してみましたが上手く行かず、 またgemと言うパッケージ管理システムを使う意味も無い気がします。

gem install rubyzip --source http://your.rubygems.mirror

此処に至って漸く問題はSSL証明書に有ると思い至り、 其れと原因を特定して問題解決に当たることにしました。

RubyGemsがSSLサーバー接続時に参照するSSL証明書

問題はGemがセキュア接続するさいの参照SSL証明書にありそうです。 其のSSL証明書はRubyインストール時にGemと共にインストールされている筈で、 しかし此れが何某かでインストールされていない、若しくは其のSSL証明書に問題があるか、 又はGemが参照するファイルを間違えている可能性が考えられます。

では利用可能なSSL証明書を入手し、 Gemが正しく其れを参照するように配置してやれば良いことになりますが、 丁度類似の情報を扱った記事 〔※3〕 が有り、SSL証明書のリンク PEM形式のCA証明書 も用意されていました。 此のファイルは Mozillaが配布しているルート証明書をcurlなどが使えるようにPEMの形式に自動的に変換 と冒頭英文が説明しており 〔※4〕 このHTMLテキスト出力を丸々コピーして手元に cacert.pem として保存、以下 setx SSL_CERT_FILE などを試行しましたが上手くは運びませんでした。

RubyGemsが参照するSSL証明書の場所

しかし何となく解決に近付きつつある予感はします。 果たしてGemはSSL証明書を何処に探しているのでしょうか? 其れを確認する方法を記した記事 〔※5〕 を参考に以下コマンドで調べてみました。

C:¥Documents and Settings¥Tsukamotch>ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
C:¥Users¥Luis¥Code¥openknapsack¥knap-build¥var¥knapsack¥software¥x86-windows¥openssl¥1.0.0k¥ssl¥cert.pem

こんなフォルダはRubyをインストールしたWindows XP機には影も形も有りません。 此処を参照していればSSL証明書は見付かる筈もない訳です。

ではRubyにインストールされたSSL証明書の場所は何処か? cert.pemでWindows XP機内を検索すると以下フォルダに 多くの拡張子に.pemを持つファイル群が見付かったのです。

C:¥Ruby200¥lib¥ruby¥gems¥2.0.0¥gems¥rubygems-update-2.1.10¥test¥rubygems

此れ等ファイル群を軒並みコピー、加えてcacert.pemも、一切合財新規に作成した C:¥Users¥Luis¥~ 以下のフォルダに保存したのです。

Sassのインストール成功

此処迄準備して徐に今回何度も打ち込んだsassのインストールコマンドを入力、 以下にある如く漸くsassのインストールの成功となった次第です。

C:¥Documents and Settings¥Tsukamotch>gem install sass
Fetching: sass-3.2.12.gem (100%)
Successfully installed sass-3.2.12
Parsing documentation for sass-3.2.12
Installing ri documentation for sass-3.2.12
1 gem installed

今回の問題発生に関する留意点

今回Gemがsassの更新ファイルの置かれているSSLサーバーに拒否され続けたのは Gemの用意するSSL証明書が妥当ではないからでした。 其処で無理矢理Gemの参照するフォルダを作り、其の中に妥当と思われるファイル群を用意して 何とか拒否される事象を回避できましたが、 ネット上を巡る内にGemのSSL証明書参照パスがハードコーディングされている旨の情報を見かけたりもしました。 此れについてはソースを確認してはいない悪しからず、 腕に覚えの有る向きならば当該箇所を修正して対応可能かも知れません。

Gemを最新にアップデートすれば当該問題が解決する可能性も有る旨の記事も見掛けました。 手元の環境では記事にも記した通り、 確り最新にアップデートしてから作業したのですが、問題が発生してしまいましたので、 一概に最新アップデートで解決出来るものではないとも思えますが、 近い内のアップデートでは当該問題は解決されており、 今回は偶々運が悪かっただけなのかも知れません。

そして今回思い知らされたのが類似の問題に於いて 其の発生に於いても解決に於いてもネット上に存在する情報が Windows OSについては皆無であることで、 殆んどがアップル社のマックのものであったのは印象的でした。 マイクロソフト社に取っては憂慮すべき事態であると思うのは些か穿ち過ぎでしょうか。

因みに実は手元の環境にはデスクトップPCのWindows 7環境も有り、 其方でもRuby、Sassをインストールしたのですが、この様な問題は発生しませんでした。 最後に其の環境に於けるRubyの参照するSSL証明書のパスを以下に記しおきましょう。

C:¥Users¥Tsukamotch>ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'
¥mingw¥ssl¥cert.pem
使用写真
  1. Synthetic ruby( photo credit: MAURO CATEB via Flickr cc
参考URL(※)
  1. インストールや実行中にエラーが起こった場合の対処法(Web制作者のためのSassの教科書:公式サポートサイト)
  2. ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError) (マーケティング担当者のしがない開発日記(PHP,MySQL,DB,Oracle,VBA,Access,RFIDなど):2011年2月23日)
  3. Windows で Ruby のSSL証明書を更新する(igaiga diary:2013年6月17日)
  4. [Ruby, Mac] Net::HTTPでSSL使用時にcertificate verify failed(黒川仁の文具堂ブログ三昧:2013年6月7日)
  5. Gem::RemoteFetcher::FetchError: SSL_connect… certificate verify failed を修正(EasyRamble:2013年10月4日)