ブログ | NGINX

NGINX による OpenSSL の QUIC+HTTP/3 サポート

NGINX-F5 水平黒タイプ RGB の一部
プラバート・ディクシット サムネイル
プラバート・ディクシット
2023年9月13日公開

開発者は通常、リリース済み、公式、サポートされているライブラリを使用してアプリケーションとインフラストラクチャを構築したいと考えています。 HTTP/3 の場合でも、QUIC をサポートし、運用インフラストラクチャのメンテナンス コストや運用の複雑さを増大させない便利なライブラリが強く求められています。

多くのQUIC+HTTP/3ユーザーにとって、デフォルトの暗号化ライブラリはOpenSSLです。 OpenSSL は、ほとんどの Linux ベースのオペレーティング システムにデフォルトでインストールされており、ナンバーワンのトランスポート層セキュリティ (TLS) ライブラリであり、ほとんどのネットワーク アプリケーションで使用されています。

問題: OpenSSL と QUIC+HTTP/3 の非互換性

このように広く使用されているにもかかわらず、OpenSSL は QUIC サポートに必要な TLS API を提供していません。 代わりに、OpenSSL 管理委員会は、完全な QUIC スタックを独自に実装することを決定しました。 この取り組みは OpenSSL v3.4 向けに計画されたかなりの努力ですが、 OpenSSL ロードマップによると、2024 年末までに実現する可能性は低いようです。 さらに、OpenSSL 実装の初期の最小実行可能製品には 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 をサポートするライブラリBoringSSLquicTLSLibreSSLなどのさまざまな 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 互換性レイヤーを作成しました。

バージョン 1.25.0 以降の NGINX オープンソース メインラインおよびNGINX Plus R30で利用可能な OpenSSL 互換性レイヤーにより、NGINX はパッチを適用したり再構築したりすることなく、OpenSSL 上で QUIC+HTTP/3 を実行できます。 これにより、QUIC サポートを取得するためにサードパーティの TLS ライブラリをコンパイルして展開する必要がなくなります。 ユーザーはサードパーティのライブラリを使用する必要がないため、それらのライブラリのスケジュールやロードマップへの依存も軽減され、本番環境に導入するのが比較的簡単なソリューションになります。

OpenSSL 互換レイヤーの仕組み

OpenSSL 互換性レイヤーは、次の手順を実装します。

  • QUIC ハンドシェイクを OpenSSL でサポートされている TLS 1.3 ハンドシェイクに変換します。
  • TLS ハンドシェイク メッセージを OpenSSL に渡します。
  • OpenSSL からハンドシェイクおよびアプリケーション暗号化レベルの暗号化キーを取得します。
  • QUIC トランスポート パラメータを OpenSSL に渡します。

今日の OpenSSL の採用量と公式 QUIC+HTTP/3 サポートの状況を踏まえると、QUIC を有効にする簡単でスケーラブルなオプションは正しい方向への一歩であると考えています。 また、HTTP/3 の採用を促進し、貴重なフィードバックも得ることができます。 最も重要なことは、OpenSSL 互換性レイヤーにより、エンタープライズ ユーザーと NGINX コミュニティ全体に、より堅牢でスケーラブルなソリューションを提供できると確信していることです。

注記: OpenSSL 互換性レイヤーの利用により、NGINX ユーザーが簡単でスケーラブルなオプションを利用できるようになる一方で、ユーザーには BoringSSL、quicTLS、LibreSSL などのサードパーティ ライブラリを NGINX で使用するオプションも残っています。どれが自分にとって適切な方法かを判断するには、どのアプローチが自分の要件に最も合っているか、またライブラリを依存関係としてコンパイルおよび管理することにどの程度慣れているかを考慮してください。

0-RTT に関する注意

0-RTT は、TLS ハンドシェイクが完了する前にクライアントがアプリケーション データを送信できるようにする QUIC の機能です。 0-RTT 機能は、以前の接続からネゴシエートされたパラメータを再利用することで可能になります。 これは、クライアントが重要なパラメータを記憶し、サーバーが同じ情報を回復できるようにする TLS セッション チケットをサーバーに提供することで有効になります。

この機能は QUIC の重要な部分ですが、OpenSSL 互換性レイヤーではまだサポートされていません。 0-RTT が必要な特定のユースケースがある場合は、フィードバックをお待ちしており、ロードマップに反映させています。

QUIC+HTTP/3 と OpenSSL を使用した NGINX の詳細

NGINX Open Sourceを使用するか、 NGINX Plus の 30 日間無料トライアルを開始することで、NGINX の OpenSSL 互換性レイヤーを今すぐ使い始めることができます。 この情報がお役に立てば幸いです。フィードバックをお待ちしています。

QUIC+HTTP/3 および OpenSSL を使用した NGINX の詳細については、以下のリソースを参照してください。


「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"