プログラミング言語 Ruby では OpenSSL の API が呼び出せるようになっています。通常配布されているバイナリパッケージの Ruby は OpenSSL とリンクされていますが、LibreSSL とリンクすることもできます。
はじめに
今回の評価環境と Ruby および OpenSSL のバージョンを確認しておきます。
環境
Ubuntu 16.04 (x86_64) で動作確認をしました。
デフォルトでインストールされている Ruby のバージョンは 2.3.0p0 でした。
また OpenSSL 1.0.2g とリンクされていることを確認しました。
$ which ruby
/usr/bin/ruby
$ ruby -v
ruby 2.3.0p0 (2015-12-25) [x86_64-linux-gnu]
$ irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> OpenSSL::OPENSSL_VERSION
=> "OpenSSL 1.0.2g 1 Mar 2016"
irb(main):003:0> exit
$
Ruby を LibreSSL でビルドする
Ruby を LibreSSL とリンクして動作確認してみます。
LibreSSL のインストール
最新の安定版 2.3.6 を /usr/local/libressl-2.3.6/ 以下にインストールします。
$ wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.3.6.tar.gz
$ tar xf libressl-2.3.6.tar.gz
$ cd libressl-2.3.6/
$ ./configure --prefix=/usr/local/libressl-2.3.6
$ make check
$ sudo make install
Ruby のビルドとインストール
GitHub から最新のレポジトリをクローンして、LibreSSL を指定してビルドを行います。
$ git clone https://github.com/ruby/ruby.git
$ cd ruby/
$ autoconf
$ ./configure --with-openssl-dir=/usr/local/libressl-2.3.6
$ make
$ make install
新しくビルドしてインストールしたRuby のバージョンとリンクされた LibreSSL のバージョンを確認してみます。
$ which ruby
/usr/local/bin/ruby
$ which irb
/usr/local/bin/irb
$ which ruby
/usr/local/bin/ruby
$ ruby -v
ruby 2.4.0dev (2016-06-26 trunk 55508) [x86_64-linux]
$ irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> OpenSSL::OPENSSL_VERSION
=> "LibreSSL 2.3.6"
irb(main):003:0> exit
$
Ruby 2.4.0dev が LibreSSL 2.3.6 とリンクされて /usr/local 配下にインストールされていることが確認できました。
Ruby の openssl テストの実行
Ruby は OpenSSL/LibreSSL 用のテストを用意しています。このテストを実行して LibreSSL の Ruby への適合性を確認してみます。
以下のコマンドを Ruby をビルドしたディレクトリで実行すると、OpenSSL/LibreSSL 用のテストのみを実行してくれます。
$ make test-all TESTS=openssl TESTOPTS="--show-skip"
...
# Running tests:
1) Skipped:
OpenSSL::TestOCSP#test_basic_response_der [/home/inoguchi/ruby/ruby/test/openssl/test_ocsp.rb:145]:
OCSP_basic_sign() is broken
2) Skipped:
OpenSSL::TestOCSP#test_single_response_check_validity [/home/inoguchi/ruby/ruby/test/openssl/test_ocsp.rb:216]:
OCSP_check_validity() is broken
Finished tests in 18.924345s, 20.7669 tests/s, 377.3446 assertions/s.
393 tests, 7141 assertions, 0 failures, 0 errors, 2 skips
ruby -v: ruby 2.4.0dev (2016-06-26 trunk 55508) [x86_64-linux]
全部で 393 のテストがあり、失敗やエラーは 0 であることを確認できましたが、2つのテストがスキップされています。
このOCSPに関する2つのテストは現時点の LibreSSL のバグによりエラーとなることが分かっています。
http://permalink.gmane.org/gmane.comp.lang.ruby.cvs/58647
OpenBSD プロジェクトではこの LibreSSL の OCSP バグを fix しており、GitHub のソースコードも修正がなされています。次にリリースされるバージョンでは解決されるでしょう。
libtls for Ruby について
libtls は、LibreSSL に含まれる TLS通信プログラミングのためのより簡易な API ですが、この libtls の RubyGems がありました。
https://rubygems.org/gems/libtls/versions/0.0.1
https://github.com/mike-burns/libtls.rb
ただし、最終更新が 0.0.1 - July 5, 2015 と古いので動作確認は必要でしょう。
まとめ
プログラミング言語 Ruby は LibreSSL とリンクして使えることを確認しました。
OpenSSL の良き代替として LibreSSL とリンクする動きは今後もフォローしていきます。