M1 Macでnginx+LibreSSLがbuildできるようになりました(+LibreSSLの紹介)
そういえば書いてなかったので軽く書いておきます。まだ開発版ですが3.7.0から可能になっています。
LibreSSL単体はM1 Macでもbuildできました。というかそもそもMacにプリインストールされているOpenSSLはOpenSSLではなくて(かなり古めの)LibreSSLです。
ただnginxと一緒にbuildするとエラーが出る状況でした。この状況はM1 Macを買ってすぐくらいから気付いていたのですが、いつか直るだろうと放置していました。しかしこの現象に困っているのが自分だけなのか全く直る気配がなく、ここは自分が動くしかないかということで調査しました。調査の結果、以下のPRを出しました。
図らずもキリ番(死語?)の800番のPRです。
LibreSSLをnginxと一緒にbuildすると、config.subというプログラムが実行しているマシンのplatformを判定しています。このプログラムは以下のプログラムのコピペになっています。
このプログラムが非常に古いままになっており、M1 Macに対応しておらず、誤ったplatformと判定してしまい、実行ができませんでした。新しいバージョンであればM1 Macでも動くので、コピペでバージョンアップをするPRです。config.guessというプログラムも同様の場所からコピペしているので、ついでにバージョンアップしておきました。
ちなみになぜかバージョン3.7.0が既にリリースされているにもかかわらず、Gitのタグ打ちが行われていません。ずっと待っていたのですが、なかなかされないので先程issueを立てておきました。
LibreSSLのメリット・デメリットなど
折角なのでLibreSSLを使うメリットを簡単に書いておきます。
- セキュリティ重視なので安心して利用できる
- 同じOpenSSLのForkであるBoringSSLと脆弱性情報を共有しており、他のOSSより対応が遅れることもおそらくない
- OpenSSLが拒否しているBoringSSLのHTTP/3向け(QUIC)のAPIを実装している
最後についてはあまり知られてないかもしれないので軽く補足します。
TLSレイヤーも扱う必要があるHTTP/3ではTLSのライブラリ側の対応が不可欠です。HTTP/3のトランスポート層現在デファクトスタンダードになっているのがGoogleが開発しているOpenSSLのForkであるBoringSSLです。
そしてこのBoringSSLのAPIと互換性を保つ形でOpenSSLに追加しようとしているのがopenssl+quicです。
現在HTTP/3対応のために利用されているのはBoringSSLかこのopenssl+quicだと思います。先日HTTP/3に対応したNode.js v17がリリースされましたが、Node.jsはopenssl+quicを利用しています。
openssl+quicは元々OpenSSLへのmergeを目標にしていましたが、今のところ拒否されており、Forkしたままメンテナンスを行う形で現在に至っています。今後どうなるか不明ですが、今のところは積極的にOpenSSLへの追従を行っています。
そしてnginxも現在HTTP/3の対応を進めており、nginx本家とは別ブランチで本家に追従する形で開発されています。
このnginx-quicはBoringSSLのAPIを前提に作られており、BoringSSLかopenssl+quicでbuildすることができます。
それ以外にも実はLibreSSL 3.6.0以降でもBoringSSLのAPIは利用できるようになっており、実際にnginx-quicをbuildすることができます。
今後OpenSSLかどういう動きをするかは不明ですが、HTTP/3に必要なAPIの実装だとBoringSSLが先行している現状で、対応次第によってはOpenSSL優位の状況が揺らぐかもしれません。そうなったときに業界内がどうなるのか、現状だと全く分かりません。状況を注視する必要があります。
ここまで書いたので、最後にLibreSSLのデメリットについて触れておきます。デメリットは
- パフォーマンスはOpenSSLよりも悪い
- セキュリティ重視のため、OpenSSLのパフォーマンス向上のコードは削除していることも多い
- 新機能追加速度が遅い
- セキュリティ重視のため、TLS 1.3対応もHTTP/3対応のコードも対応が遅かった
- 現在のMacにプリインストールされているopensslやcurlがTLS 1.3を利用できないのは、TLS 1.3に対応していないLibreSSLを利用しているため
- OpenSSL 3系に追加されたkTLSの対応もない
- セキュリティ重視のため、TLS 1.3対応もHTTP/3対応のコードも対応が遅かった
- OpenSSL 1.0.1のForkのため、それ以降のAPIは実装していないことも多い
- 例えばOpenRestyはbuildできない
という感じです。パフォーマンスが重要なら採用は難しいかもしれませんが、世の中のサービスって一部のサービスを除き、パフォーマンスよりもセキュリティの方が重要ではないかと個人的に思います。セキュリティを重要視しているならLibreSSLの採用は十分に考えられると思います。
ちなみに私も個人サーバーではnginx-quic+LibreSSLの環境で、TLS 1.3とHTTP/3を有効にした環境を運用しています。興味のある方はぜひ使ってみてはいかがでしょうか。
Discussion
OpenSSL は QUIC を自前実装で進めているのでその辺りの補足があると嬉しい気がします。