2012年12月31日月曜日

Apache Cassandra を起動すると java.net.MalformedURLException

Apache Cassandra を起動したら、java.net.MalformedURLException が発生した。

# $CASSANDRA_HOME/bin/cassandra -f
Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: vps-srv01: vps-srv01

Cassandra が参照しているホスト名は、hostname コマンドで確認できる。
ここでは環境変数 HOSTNAME は関係がない
# hostname
vps-srv01


対策1:一時的にホスト名を変更する
ホスト名を "localhost" に変更すれば起動できる。
ただしサーバを再起動すると、この変更はリセットされる。
# hostname localhost

対策2:hosts ファイルにホスト名を追加する
例えば、127.0.0.1 の行末に現在のホスト名を追記する。
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost vps-srv01

2012年12月23日日曜日

[Ruby] Apache + Passenger で Permission denied

Apache2.2 に Passenger を導入して、ブラウザでアクセスすると、

Forbidden
You don't have permission to access /index.html on this server.


ログファイルでは、
Permission denied: access to /index.html denied

これは DocumentRoot の設定が、/home の下になっていませんか?
デフォルトでは、ホームディレクトリは他ユーザのアクセス権限がありません。
Apache2 は apache アカウントで動作しており、/home 下のホームディレクトリはアクセス権限が無いためにエラーとなります。

だからホームディレクトリにアクセス権限を付ける、というのは乱暴では?
/var の下などに DocumentRoot を移動すべきだと思います。

[Ruby] gem コマンドで cannot load such file -- zlib

Ruby を make install 後に、gem コマンドでエラーになりました。
このため zlib-devel パッケージをインストール後に、再度 Ruby をインストールします。

環境は、CentOS 6.3 (64bit) / Ruby 1.9.3

# gem update
ERROR: Loading command: update (LoadError)
cannot load such file -- zlib


・・・しかし、zlib に限っては、これだけでは解決しませんでした。
どうやら、Ruby 拡張ライブラリのインストールが期待通りに行われていない様子です。

# find /usr/mofuken/ruby193/lib/ruby/site_ruby

Ruby の拡張ライブラリのディレクトリにはファイルがありませんでした。
これは zlib 以外に openssl や readline とかも足りないのでは・・?
全部をまとめてメンテナンスするのは厳しいので、仕方なく zlib だけでも補います。

# cd (Ruby ソースディレクトリ)/ext/zlib
# ruby extconf.rb
# make
# make install
/usr/bin/install -c -m 0755 zlib.so /usr/local/lib/ruby/site_ruby/1.9.1/x86_64-linux
installing default zlib libraries
# ls /usr/local/lib/ruby/site_ruby/1.9.1/x86_64-linux
zlib.so

2012年12月22日土曜日

[Ruby] gem コマンドで missing psych

Ruby を make install 後に、gem コマンドでエラーになりました。

psych とは、YAMLパーサーのバックエンドライブラリで、libyaml をベースにしています。
libyaml-devel パッケージをインストール後に、再度 Ruby をインストールすると解決します。

環境は、CentOS 6.3 (64bit) / Ruby 1.9.3

# gem update
/usr/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.

[Ruby] Nokogiri のインストールで libxml2 is missing

Nokogiri のインストールで、エラーが発生した場合の対処方法です。
環境は、CentOS 6.3 (64bit) / Ruby 1.9.3

nokogiri のインストールにおけるエラーメッセージです

# gem install nokogiri --no-ri --no-rdoc
Fetching: nokogiri-1.5.6.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for libxml/parser.h... no
-----
libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.


もしくは

Fetching: nokogiri-1.5.6.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.

/usr/local/bin/ruby extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... no
-----
libxslt is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.


ヘッダファイルが無いというメッセージとともにエラーが発生します。
Nokogiri では、libxml2 と libxslt のヘッダファイルが必要なので、
これらの devel パッケージを事前にインストールしておく必要があります。

yum install libxml2-devel
yum install libxslt-devel

公式サイトのインストール手順にも、説明があります。
http://nokogiri.org/tutorials/installing_nokogiri.html

2012年12月2日日曜日

[Ruby] デフォルトの CA 証明書ファイルを変更しても、証明書の検証に失敗する

SSL デフォルトの CA 証明書ファイル名を変更しても証明書の検証に失敗した記録です。
ルート CA 証明書を入手した方法はこちら

require 'open-uri'
require 'openssl'
OpenSSL::X509.module_eval{ remove_const(:DEFAULT_CERT_FILE) }
OpenSSL::X509.const_set( :DEFAULT_CERT_FILE, 'C:/GeoTrust.cer' )
puts open('https://www.google.com/').read

この結果では、まだ証明書の検証に失敗しています。
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

証明書やURLを変えてみても、エラーは一向に終息せず。デバッグにして追跡してみます。
OpenSSL::debug = true

どうやら、これは指定した CA 証明書が使われていない様子。

warning: error on stack: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (OpenSSL::SSL::SSLError)

手段を変えて、今度は環境変数に定義してみます。
set SSL_CERT_FILE=C:/GeoTrust.cer

require 'open-uri'
require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE
open('https://www.google.com/').read

!!デフォルトの CA 証明書ファイルは変更されていないが、正常に動作した。!!
リファレンスマニュアルでは、環境変数を設定すれば DEFAULT_CERT_FILE を変更できるような説明になっているのですが・・・どうやら別のものらしいです。
http://doc.ruby-lang.org/ja/1.9.3/method/OpenSSL=3a=3aX509/c/DEFAULT_CERT_FILE.html

libのソースを検索しても、該当箇所がなかなか見つからなかったので、調査は打ち切りました。


デフォルトの CA 証明書ディレクトリの変更についても、恐らく同じ状況なのだと思います。
OpenSSL::X509::DEFAULT_CERT_DIR

[Ruby] open-uri の HTTPS リクエストで certificate verify failed

open-uri の HTTPS リクエストで、証明書の検証に失敗する場合の対処方法です。
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

##### 方法1 #####
証明書を検証をしない(乱暴な方法)

require 'open-uri'
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
puts open('https://www.google.co.jp/').read

ただ、定数を変更すると警告が出ます。
warning: already initialized constant VERIFY_PEER

この警告を抑えるには、事前に remove_const します。
さらには、メソッドの中で定数を変更する場合ならば、上記のままだと dynamic constant assignment エラーになるので、迂回する方法もあります。
OpenSSL::SSL.module_eval{ remove_const(:VERIFY_PEER) }
OpenSSL::SSL.const_set( :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE )

ただ、現時点では上記の定数を変更するやり方が多く出回っていますが、
これは方法として(場合により)乱暴じゃないですか?


##### 方法2 #####
証明書を検証をしない(堅実な方法)

require 'open-uri'
require 'openssl'
puts open('https://www.google.com/', :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE).read

随分とスッキリしました。


##### 方法3 #####
接続したいサーバーの公開鍵証明書を使用します。

require 'open-uri'
require 'openssl'
puts open('https://www.google.co.jp/', :ssl_ca_cert => './googlecom.cer' ).read

証明書ファイル googlecom.cer は準備する必要があります。

証明書ファイルの入手方法(Windows)
> https://www.google.com をブラウザで開く
> 鍵マーク(ブラウザによる)をクリックして、「証明書」ダイアログを表示
> 「詳細」タブの「ファイルにコピー」ボタンを押す。
> 「証明書エクスポートウィザード」が開始されるので、ウィザードに従う
> # ファイル形式は「Base64 encoded X.509」を選択して、ファイルを出力する。


##### 方法4 #####
ルートCA証明書を使用します。

Rubyのデフォルト設定では、ルートCA証明書は無いのでは?
デフォルトの CA 証明書パスをコマンドで確認できます。
ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_FILE'

まずは、Googleのルート証明書を準備します。

証明書ファイルの入手方法(Windows)
> https://www.google.com をブラウザで開く
> 鍵マーク(ブラウザによる)をクリックして、「証明書」ダイアログを表示
> 「証明のパス」タブを開いて、証明書のパス ツリーのトップ(ルート)を選択する
> # ※現在は、こうなっていました。
> # GeoTrust(ルート)
> #  + Google Internet Authority
> #   + google.com
> 証明書の表示ボタンを押すと、再び「証明書」ダイアログが開く
> ※あとは「方法2」と同じです
> 「詳細」タブの「ファイルにコピー」ボタンを押す。
> 「証明書エクスポートウィザード」が開始されるので、ウィザードに従う
> # ファイル形式は「Base64 encoded X.509」を選択して、ファイルを出力する。

この CA 証明書を、前記のパスに保存すれば良いのですが・・・!?
Ruby 1.9.3 - Windows7 の場合は、デフォルトの CA 証明書ファイルは
C:/Users/Luis/Projects/oss/oneclick/rubyinstaller/sandbox/openssl/ssl/cert.pem

さすがにココで証明書を管理したくは無いです、ただデフォルト定義を変更するにはいろいろありまして・・・証明書ファイル名を変更する方法はこちら

入手した証明書を環境変数 (SSL_CERT_FILE) に設定するのが、すんなりと納まると思われる。
(例) set SSL_CERT_FILE=C:\work\cert.pem


##### 方法5 #####
ルートCA証明書を使用 2nd.

デフォルトの CA 証明書ディレクトリを変更します。
ただ、証明書のファイル名はハッシュ名である必要があり、大がかりなシステムでもなければ複数の証明書ファイルを使う必要が無いと思われるので詳細は省略します。

デフォルトの CA 証明書ディレクトリは、やはり定数に定義されています。
ruby -ropenssl -e 'puts OpenSSL::X509::DEFAULT_CERT_DIR'


##### 方法6 #####
ルートCA証明書を使用 3rd.

安易には、様々な認証局のルートCA証明書てんこもりの証明書を使う

cURL が提供しているルートCA証明書寄せ集め
http://curl.haxx.se/ca/cacert.pem

Google ならばルートCAはジオトラスト社 (GeoTrust) でしたが、これも含まれています。この証明書を先に示した方法で認識させます。
環境変数 (SSL_CERT_FILE) に設定する場合は
(例) set SSL_CERT_FILE=C:\work\cacert.pem