[Ruby] RUBY_CONFIGURE_OPTS, readline, openssl

インストール時に指定されている例が他見される RUBY_CONFIGURE_OPTS, readline, openssl について調べてみました。

きっかけ

irb (pry) で日本語が文字化けてしまったため、もろもろ確認をしました。

インストール

以前に試したとおり、現在、インストールという意味では、特に RUBY_CONFIGURE_OPTS を指定する必要ななさそう。

利用時の問題

上記の手順でインストールしたところ、下記を確認しました。
* irb 上で日本語が文字化ける
* SSL利用時に証明書エラーが出る(OAuth等でつかうことになる?)
本稿では、上記の解決を目指します。

Readline, OpenSSL とは何か

そもそもReadline, OpenSSL は、Ruby のライブラリでこんな役割をしてるよう。
* library readline
* library openssl
インストール時にも、このライブラリが使われるのかな。

動作確認

brew でインストールした Ruby と、rbenv でインストールしたものをと比較しながら確認します。
なお、Readline, OpenSSL の動作確認方法については、こちらを参考にさせて頂きました。

rbenv – .rbenv/versions/2.0.0-p247

  • irb日本語: 文字化け
  • openssl: false 証明書エラー
% bundle exec irb
irb(main):001:0> "\U+FFE3\U+FFE3\U+FFE3"
=> ""
irb(main):002:0> require 'openssl'
=> false
irb(main):003:0> require 'zlib'
=> true
irb(main):004:0> require 'psych'
=> true
irb(main):005:0> require 'open-uri'
=> true
irb(main):006:0> open('https://www.google.com/').read
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    :
    :

brew – ruby 2.0.0p247

事前に brew upgrade で最新版にしています。

% ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
% rbenv version
system (set by /Users/***/.rbenv/version)
% brew list readline
/usr/local/Cellar/readline/6.2.4/include/readline/ (8 files)
/usr/local/Cellar/readline/6.2.4/lib/libhistory.6.2.dylib
/usr/local/Cellar/readline/6.2.4/lib/libreadline.6.2.dylib
/usr/local/Cellar/readline/6.2.4/lib/ (6 other files)
/usr/local/Cellar/readline/6.2.4/share/man/ (2 files)
/usr/local/Cellar/readline/6.2.4/share/readline/ (11 files)
% brew list openssl
/usr/local/Cellar/openssl/1.0.1e/bin/openssl
/usr/local/Cellar/openssl/1.0.1e/bin/c_rehash
/usr/local/Cellar/openssl/1.0.1e/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.1e/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.1e/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.1e/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.1e/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.1e/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.1e/share/man/ (1217 files)
% brew list ruby
/usr/local/Cellar/ruby/2.0.0-p247/bin/testrb
/usr/local/Cellar/ruby/2.0.0-p247/bin/ruby
/usr/local/Cellar/ruby/2.0.0-p247/bin/ri
/usr/local/Cellar/ruby/2.0.0-p247/bin/rdoc
/usr/local/Cellar/ruby/2.0.0-p247/bin/rake
/usr/local/Cellar/ruby/2.0.0-p247/bin/irb
/usr/local/Cellar/ruby/2.0.0-p247/bin/gem
/usr/local/Cellar/ruby/2.0.0-p247/bin/erb
/usr/local/Cellar/ruby/2.0.0-p247/include/ruby-2.0.0/ (25 files)
/usr/local/Cellar/ruby/2.0.0-p247/lib/libruby.2.0.0.dylib
/usr/local/Cellar/ruby/2.0.0-p247/lib/pkgconfig/ruby-2.0.pc
/usr/local/Cellar/ruby/2.0.0-p247/lib/ruby/ (832 files)
/usr/local/Cellar/ruby/2.0.0-p247/lib/ (3 other files)
/usr/local/Cellar/ruby/2.0.0-p247/share/man/ (5 files)

* irb日本語: 文字化け
* openssl: true 証明書エラー

% irb
irb(main):001:0> "あいう"
=> "あいう"
irb(main):002:0> require 'openssl'
=> true
irb(main):003:0> require 'zlib'
=> true
irb(main):004:0> require 'psych'
=> true
irb(main):005:0> require 'open-uri'
=> true
irb(main):006:0> open('https://www.google.com/').read
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

## Readline (rbenv) の irb 日本語文字化けを直す
インストール上書きで直らないかなと思い、やってみました。

% rbenv install 2.0.0-p247
rbenv: /Users/***/.rbenv/versions/2.0.0-p247 already exists
continue with installation? (y/N) y
Downloading ruby-2.0.0-p247.tar.gz...

動作確認

% irb
irb(main):001:0> "\U+FFE3\U+FFE3\U+FFE3"
=> ""
irb(main):002:0> require 'openssl'
=> true

こちらにあるとおり、readline の指定だけは必要でした。
> * [rbenv global 2.0.0-p0 - ちなみに](http://sixeight.hatenablog.com/entry/2013/02/26/045553)

% CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --enable-bundled-libyaml" rbenv install 2.0.0-p247
rbenv: /Users/***/.rbenv/versions/2.0.0-p247 already exists
continue with installation? (y/N) y
Downloading ruby-2.0.0-p247.tar.gz...

あらためて動作確認。

% rbenv versions
* system (set by /Users/***/.rbenv/version)
1.9.3-p448
2.0.0-p247
% rbenv global 2.0.0-p247
% rbenv rehash
% irb
irb(main):001:0> "あいう"
=> "あいう"
irb(main):002:0> require 'openssl'
=> true

完了。
## OpenSSL 証明書エラーを直す
インストール時に対策している例を見る限り、他の brew Formulae の証明書を拝借するということのようです。
> * [homebrew で入れた openssl を使って Ruby をコンパイルすると SSL 利用時に証明書エラーが発生する場合の対応 - Qiita [キータ]](http://qiita.com/hotchpotch/items/12457815d5cee3723b97)
勉強不足なので詳しい方に教わりたいですが、とりあえずエラーが消せるか試してみます。
> * [SSL証明書のKEYファイル・CSRファイル・CRTファイルのチェック方法 - install memo](http://d.hatena.ne.jp/install-memo/20110906/1315291837)

% brew install curl-ca-bundle
==> Downloading https://downloads.sourceforge.net/project/machomebrew/mirror/cur
######################################################################## 100.0%
==> Caveats
To use these certificates with OpenSSL:
export SSL_CERT_FILE=/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt
==> Summary
/usr/local/Cellar/curl-ca-bundle/1.87: 2 files, 252K, built in 2 seconds
% cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

動作確認をして見たところ、ssl通信ができたようです。

% irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> require 'zlib'
=> true
irb(main):003:0> require 'psych'
=> true
irb(main):004:0> require 'open-uri'
=> true
irb(main):005:0> open('https://www.google.com/').read
=> "<!doctype html><html itemscope=\"itemscope\" itemtype=\"http://schema.org/WebPage

そのままだとなんとなく気持ち悪いので、とりあえず消しておきます。

% rm /usr/local/etc/openssl/cert.pem
remove /usr/local/etc/openssl/cert.pem? y
% brew uninstall curl-ca-bundle
Uninstalling /usr/local/Cellar/curl-ca-bundle/1.87...

## 結論
irb で日本語を使うならば、下記でインストール。

CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --enable-bundled-libyaml" rbenv install 2.0.0-p247