LibreSSL の意義

[LibreSSL](http://www.libressl.org/) は [OpenBSD プロジェクト](http://www.openbsd.org/)によって OpenSSL から2014年にフォークされ、メンテナンスされている OpenBSD 用の SSL/TLS 通信用ソフトウェアです。
OpenBSD 用としてフォークされましたが、他プラットフォーム用に移植されたポータブル版も同じく OpenBSD プロジェクトからリリースされています。

同じものを分離独立させて独自にメンテナンスを行う理由は何でしょうか？

この文章では LibreSSL の意義について考察します。

---

# OpenSSL について
はじめに LibreSSL のフォーク元の OpenSSL について簡単に説明します。

## シェア No.1 の SSL/TLS 通信用ソフトウェア
[OpenSSL](http://www.openssl.org/) は Web サイト(Web サーバ側)が https でセキュアな暗号化通信を提供する場合に必ず使われていると言える程のシェアを持つ SSL/TLS 通信用ソフトウェアです。Apache Web サーバと mod_ssl の組み合わせで SSL/TLS 設定をする場合、OpenSSL が使われています。nginx 等他の Web サーバの場合でも暗号化通信には通常 OpenSSL が使われているでしょう。Linux や BSD の OS ディストリビューションにはもれなく OpenSSL がインストールされています。

[GnuTLS](http://www.gnutls.org/) や [mbed TLS (元 PolarSSL)](https://tls.mbed.org/) 等、別の SSL/TLS 通信用ソフトウェアも存在しますが、業界標準であり圧倒的多数は OpenSSL と言えるでしょう。

OpenSSL は Webサーバだけでなく、ネットワーク機器等に組み込まれていることもあります。
一般的なWebブラウザにはほぼ組み込まれていませんが、こちらの記事によると Android ブラウザは OpenSSL を使っているようです。
http://www.itmedia.co.jp/enterprise/articles/1406/17/news038.html
SSL-VPN 製品に組み込まれていることもあります。

こうして見ると、サーバ側だけでなくクライアント側でも知らぬ間に OpenSSL を使っていることがあるのが分かります。

## 構成要素
OpenSSL は、プログラミングAPI とコマンドから構成されています。

プログラミングAPI は、SSL/TLS 通信機能を提供する libssl と暗号化機能を提供する libcrypto の２種類のライブラリファイルで提供され、`man ssl` や `man crypto` で[マニュアルを参照](https://www.openssl.org/docs/manpages.html)できます。

コマンドは `openssl`というコマンド名で、鍵やCSRの生成、暗号化やデコード、メッセージダイジェストの生成、SSL/TLS 通信のテスト用サーバとテスト用クライアント、等の機能を提供します。

暗号化通信を提供する Web サイト を Apache Web サーバで構築する場合、OpenSSL を次のように利用していることになります。
- Web サーバは mod_ssl を介して OpenSSL のプログラミングAPI を利用
- サイト管理者は `openssl` コマンドで鍵やCSRを生成してサーバ証明書を取得

## 重要性とサポート体制のギャップ
世界の Web サイトの SSL/TLS による暗号化通信(https)の大半は OpenSSL によって実現されていると考えることができます。
その重要性にも関わらずサポート体制が弱く、メンテナンスが十分になされてこなかったことが現在の OpenSSL の問題に繋がっています。

関連記事：
- Linux FoundationがCore Infrastructure Initiativeの下、OpenSSLのフルタイム開発者2人を支援
  https://osdn.jp/magazine/14/05/30/140000
- OpenSSLのコード、NCC Groupが監査へ--脆弱性の早期発見を目指す
  http://japan.zdnet.com/article/35061477/

# LibreSSL の誕生
元は OpenBSD も OpenSSL を SSL/TLS 通信用ソフトウェアとして利用していました。

## OpenBSD チームによる決断とフォーク
セキュリティを重要視している OpenBSD は、OpenSSL の抱えている様々な問題に目をつぶって使い続けることはできないと判断し、OpenBSD 用の SSL/TLS 通信用ソフトウェアを OpenSSL 1.0.1 からフォークして自分達でメンテナンスする方法を選びました。その結果生まれたのが LibreSSL です。

フォークした後の LibreSSL からは大量の不要なソースコードが削除されています。合わせて数々のソースコード上の問題が改善され、旧式のサポートされないプラットフォーム用の #ifdef などが取り除かれました。

結果として LibreSSL は OpenSSL に較べて見通しの良い健全なソースコードになっています。

関連記事：
- どんな問題があったのか、どんな改善をしたのか、は BSDcan 2014 で発表されています。C のソースコードを9万行削除したとか諸々。。。
  [LibreSSL - The first 30 days and the Future](http://www.openbsd.org/papers/bsdcan14-libressl/)
- LibreSSL 誕生の裏話的なブログ
  [origins of libressl](http://www.tedunangst.com/flak/post/origins-of-libressl)
- OpenSSL のソースコードへの非難
  [OpenSSL is written by monkeys (2009)](https://www.peereboom.us/assl/assl/html/openssl.html)

## boringssl
同様の経緯からフォークした別の実装として Google の [boringssl](https://boringssl.googlesource.com/boringssl/) があります。
boringssl はあくまで Google 内での開発プロジェクト利用を前提としたフォークで、Google 外での利用への配慮はされていないと認識しています。

## 基本方針
LibreSSL は OpenSSL と プログラミングAPI のレベルで互換性を保つことを基本方針としています。これは既存のプログラムで OpenSSL とリンクしているものを、ソースコードの変更なく LibreSSL とリンクして使えるようにすることに役立ちます。

## 他プラットフォームへの移植
OpenBSD 以外での利用のための[ポータブル版](http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/)が OpenBSD プロジェクトから提供されています。
[サポートされているプラットフォーム](http://www.libressl.org/releases.html)は BSD、Linux、OSX、Windows、商用Unix と多岐に渡っています。

# LibreSSL と OpenSSL の違い
フォーク後の数々のメンテナンスにより、両者には機能的な差異が生まれています。LibreSSL で OpenSSL を置き換えようと検討する時に注意すべき点を上げます。

## OpenSSL とのバイナリ互換性の欠如
OpenSSL とリンクされているプログラムの場合、OpenSSL をアンインストールして LibreSSL をインストールするだけではダメで、プログラムの再コンパイルと再リンクが必要となります。
OpenSSL とリンクされているプログラムが多い場合、全てリビルドが必要となるため注意が必要でしょう。

## FIPS140-2 サポートの削除
[OpenSSL でサポートされてた FIPS140-2](https://www.openssl.org/docs/fips.html) は LibreSSL ではサポートされません。
この規格への準拠が必要なケースでは LibreSSL は不適格ということになります。

## 削除された機能
セキュアでない、使われていない、等の理由により OpenBSD プロジェクトで不要と判断された機能は LibreSSL から削除されています。
[ChangeLog](https://raw.githubusercontent.com/libressl-portable/portable/master/ChangeLog) から拾ってみると、SRP、SSLv3、動的エンジンサポート、MDC-2DES、SHA-0 等が削除されています。
これら削除された機能の利用が必須である場合 LibreSSL は使えません。

## 追加された機能
LibreSSL は [ChaCha20 Poly1305](https://tools.ietf.org/html/rfc7539) といった新しい暗号スイートを追加しています。
また、よりシンプルな TLSプログラミングAPI である [libtls](http://man.openbsd.org/OpenBSD-current/man3/tls_init.3) を開発して LibreSSL に新機能を追加をしています。

これらの機能を利用したい場合、 OpenSSL を LibreSSL で置き換えたいという動機になるでしょう。

関連記事：
- ドラフトの chacha20-poly1305 は boringssl から持ってきたと。
  [libressl - more vague promises](http://www.tedunangst.com/flak/post/libressl-more-vague-promises)
- libtls については FSec 2015 でプレゼンされています。
  [LibreSSL and the new libtls API](http://www.openbsd.org/papers/libtls-fsec-2015/)

# LibreSSL の普及状況
[OpenBSD は 5.6 から](http://www.libressl.org/releases.html) LibreSSL を標準の SSL/TLS 通信用ソフトウェアとしています。
その他のOSでも、既存の OpenSSL から LibreSSL に乗り換えようとする動きがあります。

## OS としての採用
OS X 10.11 El Capitan では OpenSSL の代わりに LibreSSL が使われているようです。

関連する掲示板のトピック
[Interesting find on OS X El Capitan](https://forums.freebsd.org/threads/53231/)

## パッケージとしての提供努力
FreeBSD の標準は OpenSSL のままですが、[LibreSSL に置きかえるための情報提供](https://wiki.freebsd.org/LibreSSL)が行われています。

gentoo linux は [Project:LibreSSL](https://wiki.gentoo.org/wiki/Project:LibreSSL) で情報提供を行っています。

# まとめ
OpenSSL は依然として業界標準であり圧倒的なシェアを誇っています。
LibreSSL はまだマイナーであり利用するにも手間が必要です。
その手間を掛けてでも LibreSSL に乗り換えようとする人達の意図は、脆弱性の存在リスクの少ない方を採用したいからだと想像しています。

フォークしてからソースコードの大掃除をして、継続的にメンテナンスを続けている LibreSSL にはその希望の光が見えます。
もちろん、絶対に LibreSSL には脆弱性が存在しないと言い切れる訳ではありませんし、OpenSSL に未知の脆弱性が必ずあると言える訳でもありません。

全く別の SSL/TLS 通信用ソフトウェアに乗り換えるという案もありますが、その場合はアプリケーション側ソースコードの変更は不可避でしょう。

SSL/TLS 通信の世界は OpenSSL に偏りすぎているため良い代替案が必要です。
リスクを分散させることのできる良い代替案が LibreSSL ではないでしょうか。