開発者は通常、正式にリリースされ、公式にサポートされているライブラリを使用して、アプリケーションやインフラストラクチャを構築したいと考えています。HTTP/3においても、QUICをサポートし、本番インフラストラクチャの保守コストや運用の複雑さを増大させない、使いやすいライブラリが強く求められています。
多くのQUIC+HTTP/3ユーザーにとって、デフォルトの暗号化ライブラリはOpenSSLです。OpenSSLは、ほとんどのLinuxベースのオペレーティングシステムにデフォルトでインストールされている、最も広く利用されているTransport Layer Security(TLS)ライブラリであり、大半のネットワークアプリケーションで使用されています。
問題:OpenSSLとQUIC+HTTP/3の非互換性
これほど広く利用されているにもかかわらず、OpenSSLはQUICのサポートに必要なTLS APIを提供していません。その代わりに、OpenSSL Management Committeeは、完全なQUICスタックを独自に実装することを決定しました。これはOpenSSL v3.4で予定されている大規模な取り組みですが、OpenSSLロードマップによると、2024年末までに実現する可能性は低いとされています。さらに、OpenSSL実装の初期のMinimum Viable ProductにはQUIC APIの実装が含まれないため、OpenSSLでHTTP/3をサポートするための明確な道筋はありません。
QUICのTLSサポートの選択肢
この状況で、HTTP/3の要件に対応するQUIC TLSサポートを必要とするユーザーには、2つの選択肢があります。
- OpenSSL QUIC実装 – 前述のとおり、OpenSSLは現在、完全なQUICスタックの独自実装に取り組んでいます。この開発により、QUICのすべての機能が実装内にカプセル化されるため、HTTP/3ユーザーはQUIC固有の機能を意識することなく、OpenSSL TLS APIをより簡単に利用できるようになります。
- BoringSSL QUIC APIをサポートするライブラリ – BoringSSL、quicTLS、LibreSSLなどの各種SSLライブラリ(いずれもOpenSSLからフォークして開発が始まったもの)は、BoringSSL QUIC APIを実装することで、現在QUIC TLS機能を提供しています。ただし、これらのライブラリはOpenSSLほど広く採用されていません。また、この方法ではSSLライブラリをソースからビルドし、QUIC+HTTP/3のサポートが必要なすべてのサーバーにインストールする必要があるため、すべてのユーザーにとって実行可能な選択肢とは限りません。とはいえ、OpenSSLのQUIC TLS実装はまだ準備が整っていないため、現時点ではHTTP/3を使用したいユーザーにとって唯一の選択肢です。
新たなソリューション:OpenSSL互換レイヤー
NGINXは、こうした課題をきっかけに、OpenSSLを使用するQUIC+HTTP/3の導入を簡素化し、本番環境で別個のSSLライブラリを保守する際の複雑さを回避しやすくするため、OpenSSL Compatibility Layerを開発しました。
Available with NGINX Open Sourceメインラインのバージョン1.25.0以降およびNGINX Plus R30で利用できるOpenSSL Compatibility Layerにより、OpenSSLにパッチを適用したり再ビルドしたりすることなく、NGINXでQUIC+HTTP/3を実行できます。これにより、QUICをサポートするためにサードパーティ製TLSライブラリをコンパイルしてデプロイする必要がなくなります。また、サードパーティ製ライブラリを使用する必要がないため、それらのライブラリのスケジュールやロードマップへの依存も軽減され、本番環境へのデプロイが比較的容易になります。
OpenSSL互換レイヤーの仕組み
OpenSSL Compatibility Layerは、次の手順を実行します。
- QUICハンドシェイクを、OpenSSLがサポートするTLS 1.3ハンドシェイクに変換します。
- TLSハンドシェイクメッセージをOpenSSLに渡し、OpenSSLから受け取ります。
- ハンドシェイクおよびアプリケーションの暗号化レベルに対応する暗号鍵をOpenSSLから取得します。
- QUICトランスポートパラメーターをOpenSSLに渡し、OpenSSLから受け取ります。
現在のOpenSSLの普及状況と、QUIC+HTTP/3の公式サポートの現状を踏まえると、QUICを容易かつスケーラブルに有効化できる選択肢を提供することは、正しい方向への一歩だと考えています。これはHTTP/3の普及を促進し、有益なフィードバックを得ることにもつながります。何よりも、OpenSSL Compatibility Layerは、エンタープライズユーザーとNGINXコミュニティ全体に、より堅牢でスケーラブルなソリューションを提供するうえで役立つと確信しています。
注記:OpenSSL Compatibility Layerの提供により、NGINXユーザーが簡単かつスケーラブルな選択肢を利用できるようにする一方で、BoringSSL、quicTLS、LibreSSLなどのサードパーティ製ライブラリをNGINXで使用することも引き続き可能です。最適な方法を選ぶ際は、要件に最も適したアプローチは何か、また依存関係としてライブラリをコンパイルして管理することにどの程度対応できるかを検討してください。
0-RTTに関する注意事項
0-RTTは、TLSハンドシェイクが完了する前にクライアントがアプリケーションデータを送信できるようにするQUICの機能です。0-RTTは、以前の接続でネゴシエートされたパラメーターを再利用することで実現します。クライアントが重要なパラメーターを記憶し、サーバーが同じ情報を復元できるTLSセッションチケットをサーバーに提供することで、この機能が有効になります。
この機能はQUICの重要な要素ですが、OpenSSL Compatibility Layerではまだサポートされていません。0-RTTを必要とする具体的なユースケースがございましたら、今後のロードマップの参考とするため、ぜひフィードバックをお寄せください。
QUIC+HTTP/3およびOpenSSLに対応したNGINXの詳細
NGINXのOpenSSL互換レイヤーは、今すぐNGINX Open Sourceで利用を開始するか、NGINX Plusの30日間無料トライアルを開始してお試しいただけます。皆さまのお役に立てれば幸いです。ぜひご意見をお寄せください。
QUIC+HTTP/3およびOpenSSLに対応したNGINXの詳細については、以下のリソースをご覧ください。
- NGINXにおけるQUICネットワーキングと暗号化の入門
- プレビュー版NGINX QUIC+HTTP/3実装のバイナリパッケージを提供開始
- NGINXにおけるQUICおよびHTTP/3サポートのロードマップ
- よりセキュアな世界に向けたオープンソース支援:F5 NGINX、Let’s EncryptとOpenSSLへのスポンサーシップを発表
関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります