nginx-buildのLibreSSL対応をした
nginx-buildというGo製のソフトウェアがあります。名前の通りnginxをbuildするために使用するソフトウェアです。そのnginx-buildでLibreSSLの静的リンクが簡単にできるようにするPRをマージしてもらえました。
Only libressl does not match option name and software name.github.com
コメントにも書いたように、今までのコードはコンパイルオプションに渡すオプション名とソフトウェア名が一致している事が前提になっていました。しかしLibreSSLのオプション名は — with-opensslで一致しません。またOpenSSLと同様のオプションを付与しなければならないのでところどころ特別扱いしています。その辺りが一筋縄では行かないので少し面倒でした。
nginxとLibreSSLについて少し書いてみます。
nginxは大体のOSの標準パッケージで入るので適当に利用したいだけなら標準パッケージから入れれば十分です。しかしnginxはApacheと違いモジュールを動的に読み込むことが一般的でなく、使いたい機能がある場合はコンパイル時のオプションとして渡す必要があります。しかもnginxは開発が活発で最近でも様々な機能が追加されています。nginxを有効活用したい場合は自分でbuildするのは必須と言えます。そこでnginxを簡単にbuildするために用意されたのがnginx-buildです。
昨今のフルHTTPS化の流れからSSL/TLSを解くフロントサーバーの重要性は増すばかりです。フロントサーバーとしてnginxを使うケースは非常に多いのでnginxでSSL/TLSを解く構成を取りたいのが自然でしょう。nginxのSSL/TLS対応はOpenSSLで行います。どのようなソフトウェアにおいても言えることですが、OpenSSLの脆弱性が見つかり、OpenSSLのバージョンを上げる必要が出てくるのはWebサービスを運用していたら日常的に発生します。
多くの人にとってOpenSSLはOSの標準パッケージからインストールして、nginxからは動的リンクをするのが楽です。サポートされているOSの標準パッケージであれば脆弱性対応のupgradeが来るはずです。標準パッケージのOpenSSLをupgradeしてnginxをrestartすることでOpenSSLの脆弱性対応ができます。ちなみにDebian系のディストリビューションを使う場合はopensslだけではなくlibssl-devもupgradeすることを忘れないでください。
しかしOpenSSLはOSの標準パッケージを使うのは気を付けなければならないところがあります。HTTPSのWebサービス上ではHTTP2を使用してパフォーマンスを上げることが可能です。しかし最近のChromeでHTTP2を有効にするにはALPNに対応している必要があります。ALPNに対応するにはOpenSSL1.0.2以上が必要になります。
Debianを使う場合、2017/05/28現在の最新版であるjessie(Debian8)ではOpenSSL1.0.1が使われています。jessie-backportsを使えばOpenSSL1.0.2を使用することができます。
OpenSSLはnginx以外にも様々なソフトウェアが依存しています。OSにインストールされているOpenSSLのバージョンを変更するのは影響範囲がかなり大きく、とても面倒です。nginxでOSの標準パッケージでインストールできるOpenSSL以外のバージョンを使用したい場合、nginxで使いたいバージョンのOpenSSLを静的リンクするのが一番罠が少ない、現実的な方法です。
OpenSSLを静的リンクするならばOpenSSLをフォークしたLibreSSLも選択肢の1つになります。LibreSSLは以下の特徴があります。
- OpenSSL 1.0.1のAPIが使用できる
- ALPNが使用できる
- 新しいTLSの暗号方式ChaCha20-Poly1305が使用できる(OpenSSLなら1.1.0以上が必要)
OpenSSL1.1.0は一部のOpenSSL1.0.2のAPIと互換性がないため、簡単に使うことができません。なのでChaCha20-Poly1305を使いたい場合はLibreSSLを使用するのが現実的な選択肢でしょう。
Disclaimer 本エントリは、近々IETFで標準化される予定の新しいTLSの暗号方式 ChaCha20-Poly1305 について解説したものです。 ...d.hatena.ne.jp
しかしLibreSSLでは気を付けなければならないことがあります。それはサポートしているOSです。Linuxの場合、バージョン3.17以上がサポートされています。Debianの2017/05/28現在の最新版のjessieのLinuxカーネルのバージョンは3.16なのでサポート対象外です。私が確認した限りjessieでもビルド可能ですが、近い内にビルドできなくなるかもしれません。
長々と書きましたがnginx-buildは便利ですし、LibreSSLも簡単に静的リンクできるようになったので機会があれば是非お使いください。