LoginSignup
4
4

More than 5 years have passed since last update.

プログラミング言語 Ruby と LibreSSL

Last updated at Posted at 2016-06-26

プログラミング言語 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 とリンクする動きは今後もフォローしていきます。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4