LibreSSL の現在（2018年2月時点）

[LibreSSL](http://www.libressl.org/) は [OpenBSD プロジェクト](http://www.openbsd.org/) によってメンテナンスされている SSL/TLS 通信用ライブラリです。
2016年に [LibreSSL の意義](https://qiita.com/kinichiro/items/3108e950b056963c33ad) という文書を書きましたが、当時からは状況が変化してきたので2018年現在の LibreSSL についてまとめてみようと思います。

# OpenSSL の現状

まずは [OpenSSL](https://www.openssl.org/) の現状です。
OpenSSL は SSL/TLS 通信用ライブラリとして数多くの OSS プロジェクトや製品で使われています。
また、SSL/TLS の機能革新を積極的に取り入れて SSL/TLS 仕様の進化に貢献しています。現在だと TLSv1.3 の実装がそれにあたると思います。

## バージョンのサポート期間と互換性のポリシー

OpenSSL は2018年現在、2つのバージョンをサポートしています。
https://www.openssl.org/policies/releasestrat.html

- バージョン 1.0.2 は 2019-12-31 までサポート (LTS)
- バージョン 1.1.0 は 1.1.1 リリース後、1年間サポート

OpenSSL プロジェクトでは、機能追加を含まないバグフィックスのみのリリースを "レターリリース(Letter release)" と呼び、バージョン番号の後にアルファベットの小文字を付けます。（1.0.2a のように）

機能追加を含むがライブラリのバイナリ互換性を保つリリースは "マイナーリリース(Minor release)" と呼ばれ、バージョン番号の1桁目の数字がインクリメントされます。（例えば 1.1.0 が 1.1.1 となる）

前述の TLSv1.3 は機能追加となるので 1.0.2 でも 1.1.0 でもなく、1.1.1 というバージョンで提供されることになります。

また、LTS と指定されたバージョンは最低5年間サポートされ、LTS でないバージョンは最低2年間サポートされるというのがポリシーとして定義されています。LTSの対象となるバージョンの指定は最低4年に一度行われます。

## 1.1.1 の予定

TLSv1.3 の仕様が確定していないのでまだ予定ですが、2018/2/6更新の [Release Strategy](https://www.openssl.org/policies/releasestrat.html) によると 1.1.1 は2018/5/8 正式リリースを目標として計画されています。

この通りにリリースがなされたとすると、サポート期間はこうなるでしょう。

- バージョン 1.0.2 は 2019-12-31 までサポート (LTS)
- バージョン 1.1.0 は (1.1.1が予定通り出たら) 2019-05-07 までサポート
- バージョン 1.1.1 は (最低でも) 2020-05-07 までサポート

真ん中のバージョンの 1.1.0 が最初にサポートされなくなることになるのですね。

<font color="red">(2018/10/03 追記)</font>
OpenSSL 1.1.1 は 2018-09-11 に正式リリースされ、これが LTS になると発表されました。
[Release Strategy](https://www.openssl.org/policies/releasestrat.html) は 2018-05-29 からまだ更新されていませんが、サポート期間は以下のようになるでしょう。

- バージョン 1.0.2 は 2019-12-31 までサポート
- バージョン 1.1.0 は 2019-09-10 までサポート
- バージョン 1.1.1 は (最低でも) 2023-09-10 までサポート (LTS)

## アプリケーション側での 1.0.2 と 1.1.x のサポート

既存のアプリケーションは 1.0.2 に対応しているものが多いでしょうが、1.0.2 のサポートが終了することを考えると 1.1.x 系のサポートが必要になります。1.1.x 系をサポートすることで TLSv1.3 対応も可能になりますので、当然 1.1.x 系のサポートを 2019年の年末までに計画に入れようとするでしょう。

ここで問題になるのは、1.0.2 と 1.1.x 系は前述のようにマイナーバージョンが異なることでライブラリの API 互換性の問題などで 1.1.x 系をサポートするために多くの労力が必要となる「可能性がある」ということです。アプリケーションでの OpenSSL API の使い方によるのですんなり 1.1.x 系に移行できるプロジェクトもあるかもしれませんが。

*2つのバージョン間での差異については以下にまとめられています。
[OpenSSL 1.1.0 Changes](https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes)*

# LibreSSL の現状

次に [LibreSSL](http://www.libressl.org/) の現状についてです。

## LibreSSL は OpenSSL 1.0.1 + α

LibreSSL は 2014年に、当時のサポートバージョンであった OpenSSL 1.0.1 からフォークされました。OpenSSLと入れ替えられるように API の互換性は保ちつつソースコードを改善するという方針で作業が進められ、今日に至っています。このため LibreSSL は基本的に OpenSSL 1.0.1 と API レベルでの互換性を今も保っています。

但し、アプリケーション・プロジェクトからの要望などにより、OpenSSL 1.0.2 から一部の API を取り込んでいたりもします。しかし、1.0.2 の全ての API を取り込めてはいません。

つまり、LibreSSL は API 互換性の観点でいうと OpenSSL **1.0.1 + α** と言うことができるでしょう。

## LibreSSL の独自進化

<font color="red">(2018/02/15 追記)</font>
OpenSSL との API 互換以外には、LibreSSL は独自の進化を遂げています。

- 新しいシンプルな TLS ライブラリ の [libtls](https://man.openbsd.org/?query=tls_init)
- [nc](https://man.openbsd.org/?query=nc) や [ocspcheck](https://man.openbsd.org/?query=ocspcheck) といった libtls を使った便利なコマンドラインツール

その他 LibreSSL のバージョン毎の進化は [ChangeLog](https://raw.githubusercontent.com/libressl-portable/portable/master/ChangeLog) に詳しいです。

## TLSv1.3 と LibreSSL

LibreSSL ではまだ明確に TLSv1.3 サポートの計画を出していません。まだ確定していない仕様であるため慎重な態度を示しているようです。

どうなるかは分かりませんが、現状の方針のまま進むとすると、1.0.1 に TLSv1.3 の機能が追加されたようなものになるでしょう。仮にそうだとすると、OpenSSL 1.1.x 系への対応が一苦労なプロジェクトにとっては、TLSv1.3 対応を労少なくして行える福音となるかもしれません。

これが実現すると、TLSv1.3 を実装した OpenSSL API 互換のライブラリが、OpenSSL プロジェクトの 1.1.x 系 と LibreSSL の 1.0.1 系の２つ存在することになるでしょう。しかもこの2つはマイナーバージョンが異なるのでお互いには API 互換がなく、なかなか複雑な話になります。

あるいは、TLSv1.3 サポートのタイミングで 1.1.x 系への転換ということも案としては考えられますが、これはかなりの労力が必要そうです。1.0.1 からフォークした直後に行った全面的なソースコードの大掃除を 1.1.x 系のソースコードにもう一度行うことになってしまうでしょうから。また 1.0.x 系との互換性を捨てることにもつながるので難しいのかなあ、と思います。

<font color="red">(2018/02/15 追記)</font>
2018/02/14 のこのコミットで LibreSSL の今後の方向性が定まりました。

commit: [Start providing parts of the OpenSSL 1.1 API.](https://marc.info/?l=openbsd-cvs&m=151862593422966&w=2)

様々なソフトウェアが LibreSSL で動けるようにするための、OpenSSL の 1.1.x 系の API の提供が始まりました。
また従来の 1.0.1 の API の削除はしません。
これにより LibreSSL は OpenSSL の 1.0.x 系と 1.1.x 系の橋渡しになっていくと私は思います。

<font color="red">(2018/11/10 追記)</font>
2018/11/06 のこのあたりのコミットから現在の開発バージョンである LibreSSL 2.9.x への TLSv1.3 の追加が始まりました。

commit: [Add TLS extension type values for TLSv1.3 (under guards).](https://marc.info/?l=openbsd-cvs&m=154153729923551&w=2)

# OSS プロジェクトや OS ディストリビューションへの影響

SSL/TLS 通信のライブラリとして OpenSSL 1.0.2 / 1.1.x と "OpenSSL 1.0.1 + α 相当" の LibreSSL が存在することは周囲にどのような影響を与えているのでしょうか。

OpenSSL と並行して LibreSSL もサポートする OSS プロジェクトがあります。このようなプロジェクトの場合、OpenSSL 1.0.2 と 1.1.0 のどちらかあるいは両方と LibreSSL で動作を確認する必要があります。ソースコードのメンテナンスもですが、動作確認テストも必要です。

更に、OpenBSD のように OpenSSL の代わりに LibreSSL を SSL/TLS 通信のライブラリとして採用する OS ディストリビューションもあります。このような OS の場合、OpenSSL でしか動かないソフトウェアを LibreSSL で動かせるようにパッチを準備する必要があるでしょう。

選択肢が多いのは良いことだと思うのですが、全てをサポートするのには労力が掛かります。

2014年にフォークした時は、「OpenBSD プロジェクトが自前のライブラリを用意したなあ」くらいの受け取られ方でしかなかったように記憶してます。このような状況になることは想像できませんでしたね。

# まとめ
LibreSSL の現状について2018年2月時点の状況を、OpenSSL の現状と比較しつつ書いてみました。誕生当時、OpenSSL と API 互換を標榜していた LibreSSL ですが OpenSSL 1.0.1 がサポートバージョンでなくなったことにより API 互換の拠り所がなくなっています。

2014年に同じくフォークした Google の boringssl はその用途や目的から表にあらわれてきません。一方、ポータブル版を最初から用意し OpenBSD プロジェクト以外でも使われることを想定していた LibreSSL は様々なソフトウェアや OS で利用され、少しずつ存在感を増してきていると思います。

それゆえ、OpenSSL と LibreSSL の両方をサポートしようとする時に突き当たる API 互換などの問題は皮肉に思われます。

ここから更に、TLSv1.3 がサポートされたりすると LibreSSL はどんな風になっていくのか興味深いです。

OpenBSD プロジェクトは寄付を募ってます。
メールアドレス指定で日本からでもPayPalでの寄付ができます。
詳しくはこちら： https://www.openbsd.org/donations.html