サーバー名表示( SNI ) は、トランスポート層セキュリティ (TLS)コンピュータ ネットワーク プロトコルの拡張機能であり、クライアントがハンドシェイク プロセスの開始時に接続しようとしているホスト名を示します。 [1]この拡張機能により、サーバーは同じIP アドレスとTCP ポート番号で複数の証明書のうち 1 つを提示できるため、複数の安全な ( HTTPS ) Web サイト (または TLS 経由のその他のサービス) を同じ IP アドレスで提供できます。すべてのサイトで同じ証明書を使用する必要はありません。これは、HTTP/1.1 の名前ベースの仮想ホスティングと概念的に同等ですが、HTTPS 用です。これにより、プロキシは TLS/SSL ハンドシェイク中にクライアント トラフィックを適切なサーバーに転送することもできます。元の SNI 拡張機能では目的のホスト名が暗号化されていないため、盗聴者は要求されているサイトを確認できます。SNI 拡張機能は、2003 年にRFC 3546 で指定されました。
問題の背景
SNI 以前は、TLS 接続を行う際に、クライアントは接続先のサイトを指定することができませんでした。そのため、1 つのサーバーが単一のリスナーで複数のサイトをホストしている場合、サーバーは TLS プロトコルでどの証明書を使用するかを知る方法がありません。詳しく言うと、TLS 接続を行う際に、クライアントは Web サーバーにデジタル証明書を要求します。サーバーが証明書を送信すると、クライアントは証明書を調べ、接続先の名前と証明書に含まれる名前を比較します。一致した場合は、接続は通常どおり続行されます。一致が見つからない場合は、不一致が中間者攻撃の試みを示している可能性があるため、ユーザーに不一致の警告が表示され、接続が中止されることがあります。ただし、一部のアプリケーションでは、ユーザーが警告をバイパスして接続を続行できます。この場合、証明書を信頼する責任、ひいては接続を信頼する責任はユーザーにあります。
しかし、サーバーが管理するすべての名前をカバーする単一の証明書を取得することは困難である可能性があり、すべての名前の完全なリストが事前にないため、不可能になることもあります。複数のホスト名を管理するサーバーは、名前ごと(または名前の小さなグループ)に異なる証明書を提示する必要がある可能性があります。subjectAltName を使用すると、1人の人物[2]によって管理される複数のドメインを単一の証明書に含めることができます。このような「統合通信証明書」は、ドメインのリストが変更されるたびに再発行する必要があります。
名前ベースの仮想ホスティングでは、複数の DNS ホスト名を単一のサーバー (通常は Web サーバー) で同じ IP アドレス上でホストできます。これを実現するために、サーバーはプロトコルの一部としてクライアントが提示したホスト名を使用します (HTTP の場合、名前はホスト ヘッダーで提示されます)。ただし、HTTPS を使用する場合、サーバーが HTTP ヘッダーを確認する前に TLS ハンドシェイクが行われます。そのため、サーバーは HTTP ホスト ヘッダーの情報を使用してどの証明書を提示するかを決定することができず、同じ IP アドレスからは、同じ証明書でカバーされている名前しか提供できませんでした。
実際には、これは、安全で効率的なブラウジングのために、HTTPS サーバーが IP アドレスごとに 1 つのドメイン (またはドメインの小グループ) しか処理できないことを意味していました。サイトごとに個別の IP アドレスを割り当てると、IP アドレスの要求を地域のインターネット レジストリに正当化する必要があり、IPv4 アドレスが枯渇しているため、ホスティング コストが増加します。IPv6 の場合、アドレス空間が枯渇していないにもかかわらず、1 台のマシンに複数の IP が存在するため、管理オーバーヘッドが増加します。その結果、多くの Web サイトが安全な通信の使用を事実上制限されました。
技術原理
SNI は、クライアントが TLS ネゴシエーションのClientHelloメッセージの一部として仮想ドメイン名を送信することで、この問題に対処します。 [3]これにより、サーバーは正しい仮想ドメインを早期に選択し、正しい名前を含む証明書をブラウザーに提示できます。したがって、SNI を実装するクライアントとサーバーを使用すると、単一の IP アドレスを持つサーバーで、共通の証明書を取得することが非現実的なドメイン名のグループに対応できます。
SNI は、2003 年 6 月に RFC 3546「トランスポート層セキュリティ (TLS) 拡張」を通じてIETFのインターネット RFCに追加されました。この標準の最新バージョンは RFC 6066 です。
セキュリティへの影響
サーバー名表示ペイロードは暗号化されていないため、クライアントが接続しようとしているサーバーのホスト名は盗聴者に見える状態です。このプロトコルの弱点は、ネットワークフィルタリングと監視のためのセキュリティソフトウェア[4] [5] [6]や、検閲を実施するための政府によって悪用されました。[7]
現在、サーバー名表示を隠そうとする技術は複数あります。
ドメインフロンティング
ドメイン フロンティングは、SNI 内の目的のホスト名を、同じサーバー、またはより一般的にはコンテンツ配信ネットワークと呼ばれるサーバー ネットワークによってホストされている別のホスト名に置き換える手法です。クライアントがドメイン フロンティングを使用すると、サーバー ドメインが SNI (暗号化されていない) に置き換えられますが、サーバーが適切なコンテンツを提供できるように、HTTP ホスト ヘッダー (TLS によって暗号化されている) にはそのまま残ります。ドメイン フロンティングは SNI 自体を定義する標準に違反するため、互換性が制限されます (多くのサービスは、SNI ホストが HTTP ヘッダー ホストと一致するかどうかを確認し、ドメイン フロンティングされた SNI との接続を無効として拒否します)。ドメイン フロンティングは、以前は政府の検閲を回避するために使用されていましたが、[8]主要なクラウド プロバイダー (Google、Amazon の AWS、CloudFront) が利用規約で明示的に禁止し、技術的な制限を設けているため、その人気は低下しました。[9]
暗号化されたクライアントHello
暗号化クライアントHello(ECH)は、TLS 1.3ネゴシエーションの初期段階で送信されるクライアントHelloメッセージ全体の暗号化を可能にするTLS 1.3プロトコル拡張です。 [10] ECHは、証明書利用者(Webブラウザ)が事前に知っておく必要がある公開鍵を使用してペイロードを暗号化します。つまり、ECHはブラウザベンダーが事前に知っている 大規模なCDNで最も効果的です。
この拡張機能の2018年版はEncrypted SNI (ESNI) [11]と呼ばれ、ドメイン盗聴のリスクに対処するために「実験的」な形で実装されました。[12] [13] [14] Firefox 85ではESNIのサポートが削除されました。[15] ECHとは対照的に、Encrypted SNIはClient Hello全体ではなくSNIのみを暗号化しました。[16]このバージョンのオプトインサポートは2018年10月にFirefoxに組み込まれ[17]、DNS over HTTPS (DoH) を有効にする必要がありました。[18]
2020年3月、分析によりSNIのみを暗号化するだけでは不十分であることが実証された後、ESNIはECH拡張に作り直されました。たとえば、仕様では、セッション再開を容易にするためのあらゆるデータを事前共有キー拡張に含めることが許可されており、ESNIによって暗号化されたサーバー名とまったく同じクリアテキストのコピーを送信することさえ可能です。また、拡張機能を1つずつ暗号化するには、すべての拡張機能の暗号化されたバリアントが必要になり、それぞれがプライバシーに影響を与える可能性があり、宣伝されている拡張機能のセットが公開されます。最後に、ESNIの実際の展開により、相互運用性の制限が明らかになりました。[19]短縮名は2020年3月にECHOでしたが[16]、2020年5月にECHに変更されました。[20]
ESNIとECHはどちらもTLS 1.3で初めて定義されたKeyShareEntryに依存しているため、TLS 1.3とのみ互換性があります。[21] [22]また、ECHを使用するには、クライアントは1.3未満のTLSバージョンを提案してはなりません。[23]
別のインターネットドラフトでは、ECH公開鍵をHTTPSおよびSVCB DNSレコードタイプ経由で送信するためのパラメータが組み込まれており、ハンドシェイクプロセスが短縮されています。[24] [25]
2020年8月、中国のグレートファイアウォールはESNIトラフィックをブロックし始めましたが、ECHトラフィックは引き続き許可しました。[26]
2020年10月、ロシアのISPロステレコムとそのモバイルオペレーターTele2はESNIトラフィックのブロックを開始しました。[27]同年9月、ロシアの検閲省ロスコムナゾールは、ウェブサイトアクセスの検閲を妨げるTLS 1.3とESNIを含む一連の暗号化プロトコルを禁止する計画を立てました。[28] [29] [30]
2023年7月のIETF117会議で、ECHに取り組んでいるメンバーは、ChromeとFirefoxが1%のサンプルトライアルを実施していることを通知し、チームは最終ドラフトが2024年1月までにIESG評価に提出されることを期待しています。 [31] [32]
2023年9月、Cloudflareはホストドメインに対してECHのサポートを開始しました。[33]
2023年10月、MozillaはFirefox v118でECHをデフォルトで有効化しましたが、DNS over HTTPS(DoH)も有効化されていることを条件としました[34] [35] 。これにより、 HTTPSリソースレコードに対するDNSリクエストがコンピュータネットワーク上で盗聴されるのを防ぐことができます。 [36] 2023年9月、Chromiumバージョン117(Google Chrome、Microsoft Edge、Samsung Internet、Operaで使用)ではこれをデフォルトで有効化し、DNSのHTTPSリソースレコードにキーを展開することも要求しました。[37] [38]
実装
2004年、 OpenSSLにTLS/SNIを追加するためのパッチがEdelKeyプロジェクトによって作成されました。[39] 2006年にこのパッチはOpenSSLの開発ブランチに移植され、2007年にOpenSSL 0.9.8(最初に0.9.8fでリリースされました[40])にバックポートされました。SNIをサポートする最初のWebブラウザは2006年に登場し(Mozilla Firefox 2.0、Internet Explorer 7)、その後Webサーバーが登場しました(2009年にApache HTTP Server、2012年にMicrosoft IIS)。
アプリケーション プログラムが SNI を実装するには、使用する TLS ライブラリが SNI を実装し、アプリケーションがホスト名を TLS ライブラリに渡す必要があります。さらに複雑なことに、TLS ライブラリはアプリケーション プログラムに含まれている場合もあれば、基盤となるオペレーティング システムのコンポーネントである場合もあります。このため、一部のブラウザーはどのオペレーティング システムでも SNI を実装しますが、他のブラウザーは特定のオペレーティング システムでのみ SNI を実装します。[引用が必要]
サポート
参考文献
- ^ Blake-Wilson, Simon; Nystrom, Magnus; Hopwood, David; Mikkelsen, Jan; Wright, Tim (2003 年 6 月)。「Server Name ssl_ocsp_responderIndication」。トランスポート層セキュリティ (TLS) 拡張。IETF。p . 8。sec . 3.1。doi : 10.17487 / RFC3546。ISSN 2070-1721。RFC 3546 。
- ^ 「マルチドメイン (UCC) SSL 証明書とは何ですか?」GoDaddy。
- ^ 「TLS Server Name Indication」。Paul 's Journal 。 2024年7月3日閲覧。
- ^ 「Web フィルター: SNI 拡張機能と HTTPS ブロッキング」www3.trustwave.com . 2024 年7 月 3 日閲覧。
- ^ 「Sophos UTM: Sophos Web フィルタリングを理解する」。Sophosコミュニティ。2019年2 月 20 日閲覧。
- ^ Chrisment, Isabelle; Goichot, Antoine; Cholez, Thibault; Shbair, Wazen M. (2015 年 5 月 11 日)。「SNI ベースの HTTPS フィルタリングを効率的にバイパスする」。2015 IFIP/IEEE 国際統合ネットワーク管理シンポジウム (IM)。pp. 990–995。doi : 10.1109/ INM.2015.7140423。ISBN 978-1-4799-8241-7. S2CID 14963313。
- ^ 「韓国はSNIトラフィックをスヌーピングしてインターネットを検閲している」BleepingComputer 2019年2月18日閲覧。
- ^ 「暗号化チャットアプリSignalが政府の検閲を回避」Engadget 。 2024年7月3日閲覧。
- ^ 「Amazon、検閲回避を理由にSignalのAWSアカウントを停止すると脅迫」Signal 。 2018年5月2日閲覧。
- ^ Rescorla, Eric; Oku, Kazuho; Sullivan, Nick; Wood, Christopher A. (2023 年 10 月 9 日). TLS 暗号化クライアント Hello (レポート). インターネット エンジニアリング タスク フォース.
- ^ Rescorla, Eric; Oku, Kazuho; Sullivan, Nick; Wood, Christopher A. (2023年4月6日). 「Draft-ietf-TLS-esni-14」.
- ^ 「ESNI: HTTPS のプライバシー保護アップグレード」EFF DeepLinks ブログ2018 年 9 月 24 日。
- ^ Claburn, Thomas (2018年7月17日). 「ドメイン フロンティングについて慌てる必要はありません。SNI の修正はハッキングされています」。The Register 。 2018年10月10日閲覧。
- ^ Ghedini, Alessandro (2018 年 9 月 24 日)。「暗号化しないと失われる: 暗号化された SNI の仕組み」。Cloudflare ブログ。2019 年5 月 13 日閲覧。
- ^ “1667743 - 未使用の esni コードをクリーンアップする”. bugzilla.mozilla.org . 2022年4月7日閲覧。
- ^ ab "ESNI -> ECHO · tlswg/draft-ietf-tls-esni". GitHub .
- ^ Eric, Rescorla (2018 年 10 月 18 日)。「暗号化された SNI が Firefox Nightly に登場」。Mozillaセキュリティ ブログ。2020年6 月 15 日閲覧。
- ^ Daniel, Stenberg. 「Curl: Re: 暗号化された SNI のサポート (curl-library メーリング リスト アーカイブ)」. curl.se . 2020 年6 月 15 日閲覧。
- ^ Jacobs, Kevin (2021年1月7日). 「Encrypted Client Hello: Firefox における ESNI の将来」. Mozilla セキュリティ ブログ. 2021年1月9日閲覧。
- ^ "s/ECHO/ECH · tlswg/draft-ietf-tls-esni". GitHub .
- ^ Ghedini, Alessandro (2018年9月24日). 「暗号化するか失うか: 暗号化されたSNIの仕組み」. Cloudflareブログ. 2019年5月13日閲覧。
これはTLSバージョン1.3以降の拡張機能であり、プロトコルの以前のバージョンでは機能しません。
- ^ 「ESNI TLS 1.2 互換にする · Issue #38 · tlswg/draft-ietf-tls-esni」。GitHub。2020年8月 9 日閲覧。
- ^ Rescorla, Eric. 「TLS Encrypted Client Hello」. tlswg.org . 2021年2月24日閲覧。
クライアントは... TLS 1.3以上のネゴシエートを申し出る必要があります。
- ^ Schwartz, Benjamin M.; Bishop, Mike; Nygren, Erik (2023年3月11日). 「DNS 経由のサービスバインディングとパラメータ仕様 (DNS SVCB および HTTPS RR)」。インターネットエンジニアリングタスクフォース。 2023年7月25日閲覧。
- ^ Schwartz, Benjamin M.; Bishop, Mike; Nygren, Erik (2023年9月26日). 「DNSサービスバインディングによるTLS暗号化ClientHelloのブートストラップ」。インターネットエンジニアリングタスクフォース。 2023年10月1日閲覧。
- ^ Cimpanu、Catalin。「中国は現在、TLS 1.3とESNIを使用するすべての暗号化されたHTTPSトラフィックをブロックしています」。ZDNet 。 2020年8月9日閲覧。
- ^ “Почему Ростелеком блокирует ESNI трафик?”. qna.habr.com (ロシア語)。 2020 年 10 月 11 日。2020 年10 月 30 日に取得。
- ^ 「ロシアのデジタル開発省は、RuNetから最新の暗号化技術を禁止したいと考えている」Meduza 。 2021年6月18日閲覧。
- ^ Cimpanu、Catalin。「ロシアはTLS 1.3、DoH、DoT、ESNIなどの安全なプロトコルの使用を禁止したい」ZDNet 。 2021年6月18日閲覧。
- ^ シャーマン、ジャスティン(2020年9月25日)。「ロシアは、自国のインターネットを世界から隔離するために何か新しいことを試みている」スレートマガジン。2021年6月18日閲覧。
- ^ TLSワーキンググループ(2023年7月26日)。「議事録IETF117:tls:水曜日20:00」。IETFデータトラッカー。2023年8月2日時点のオリジナルよりアーカイブ。2023年8月2日閲覧。
- ^ TLSワーキンググループ(2023年7月26日)。IETF117-TLS-20230726-2000。YouTube (動画)。サンフランシスコ:インターネットエンジニアリングタスクフォース。 2023年8月2日閲覧。
- ^ Achiel van der Mandele、Alessandro Ghedini、Christopher Wood、Rushil Mehra。「Encrypted Client Hello - プライバシーを守る最後のパズルピース」。Cloudflare ブログ。2023年10 月 1 日閲覧。
- ^ 「Encrypted Client Hello (ECH) を理解する | Firefox ヘルプ」. support.mozilla.org . 2023 年10 月 4 日閲覧。
- ^ 「暗号化されたよりプライベートなインターネットへようこそ。 | The Mozilla Blog」。blog.mozilla.org 。 2023年10月4日閲覧。
- ^ 「Encrypted Client Hello (ECH) - よくある質問 | Firefox ヘルプ」. support.mozilla.org . 2023年11月25日閲覧。
- ^ 「PowerShell を使用して Google Chrome で TLS 暗号化 ClientHello を無効にする方法」。Chaser Systems Ltd. 2023 年 10 月 9 日。
- ^ 「機能: TLS 暗号化クライアント Hello (ECH)」。Chromeプラットフォーム ステータス。Google。2023年 12 月 12 日。2024年2 月 21 日に閲覧。
- ^ 「EdelKeyプロジェクト」. edelweb.fr . 2019年2月20日閲覧。
- ^ 「OpenSSL CHANGES」。2016年4月20日時点のオリジナルよりアーカイブ。
- ^ 「パブリック Git ホスティング - alpine.git/Commit」。
- ^ 「Encrypted Client Hello を有効にして Microsoft Edge のプライバシーを向上させる方法」。Neowin 2023年7月25日。2022年12月5日時点のオリジナルよりアーカイブ。 2023年7月25日閲覧。
- ^ ab "Developing ECH for OpenSSL (DEfO)". defo.ie . Tolerant Networks Limited. 2022年8月24日。2022年9月1日時点のオリジナルよりアーカイブ。
- ^ 「Encrypted Client Hello (ECH) を理解する | Firefox ヘルプ」. support.mozilla.org . 2023 年10 月 4 日閲覧。
- ^ 「curl/docs/ ECH.md at cbe7fad20d969626a5c4eb0501a273dfe812bcd3 · curl/curl」。GitHub 。 2023年7月26日閲覧。
- ^ 「curl/docs/ROADMAP.md at 50490c0679fcd0e50bb3a8fbf2d9244845652cf0 · curl/curl」。GitHub 。2023年7月26日閲覧。
- ^ 「機能: TLS 暗号化クライアント Hello (ECH)」。Chrome プラットフォーム ステータス。2023 年 5 月 28 日時点のオリジナルよりアーカイブ。2023年7 月 25 日閲覧。Safari
: 信号なし
- ^ 「リリースノート バージョン 7.8」。Campus @Barracuda。2013年 9 月。2021 年1 月 5 日に閲覧。
- ^ 「リリースノート バージョン 5.2」。Campus @Barracuda。2015年 9 月。2021 年1 月 5 日に閲覧。
- ^ 「バグ 765064 – Sync およびその他のサービスで使用されている HttpClient は SNI をサポートしていません」。Bugzilla @Mozilla。2017年 10 月 29 日。2017年11 月 9 日に閲覧。
- ^ 「 IBM HTTP Server SSL に関する質問と回答」 。IBM。2011年3 月 8 日閲覧。
- ^ 「IHS 8 は Apache 2.2.x を搭載?」。IBM。2013年10月17日。2015年12月26日時点のオリジナルよりアーカイブ。 2017年11月9日閲覧。
- ^ "#2275 (暗号化されたクライアント Hello のサポート) – nginx". trac.nginx.org . 2023 年7 月 6 日閲覧。
- ^ 「パフォーマンスの向上」。help.hcltechsw.com 。 2024年2月6日閲覧。
- ^ “ECH by kazuho · Pull Request #3164 · h2o/h2o”. GitHub . 2023年7月6日閲覧。
- ^ 「Base Directives - Configure」。H2O - 最適化された HTTP/2 サーバー。2023 年 5 月 29 日時点のオリジナルよりアーカイブ。2023年7 月 18 日閲覧。
- ^ 「draft-ietf-tls-esni-13 へのアップデート」。BoringSSLコード リポジトリ。2023 年7 月 6 日閲覧。
- ^ 「Dell BSAFE Micro Edition Suite 5.0 リリースアドバイザリ」 。 2022年10月18日閲覧。
- ^ 「Support ECH (#595) · Issues · gnutls / GnuTLS · GitLab」。GitLab 。 2018年10月27日。 2023年7月26日閲覧。
- ^ 「Support ESNI · Issue #546 · libressl/portable」。GitHub 。 2023年7月26日閲覧。
- ^ 「116168 - NSS での TLS サーバー名表示拡張のサポート」。bugzilla.mozilla.org 。2023年7 月 6 日閲覧。
- ^ 「D101050 Bug 1681585 - ECH サポートを selfserv に追加」。phabricator.services.mozilla.com。2023年7月 6 日閲覧。
- ^ 「バグ 360421 – サーバーに TLS サーバー名表示を実装する」。Bugzilla @Mozilla。2006年 11 月 11 日。2012年10 月 30 日閲覧。
- ^ 「Encrypted Client Hello (旧称 ESNI) のサポート · Issue #7482 · openssl/openssl」。GitHub。2023年7 月 6 日閲覧。
- ^ 「[ech] ESNI を ECH ドラフト 15 に書き換え by kazuho · Pull Request #437 · h2o/picotls」. GitHub . 2023 年7 月 6 日閲覧。
- ^ McCarney, Daniel (2024年5月31日). 「サーバー側暗号化クライアントHello(ECH)のサポート」. GitHub . 2024年8月22日閲覧。
- ^ 「サーバーの証明書の選択がありません · Issue #310 · apple/swift-nio-ssl」。GitHub 。 2023年7月26日閲覧。
- ^ 「TLS v1.3 Encrypted Client Hello (ECH) draft-ietf-tls のサポートを追加します… · wolfSSL/wolfssl@6b6ad38」。GitHub 。2023年7月25日閲覧。
- ^ 「crypto/tls: implement draft-ietf-tls-esni-13 · cloudflare/go@4c13101」。GitHub 。 2023年7月25日閲覧。
- ^ “src/tls.c · master · Hugo Leisink / Hiawatha web server · GitLab”. GitLab . 2023年4月5日. 2023年7月26日閲覧。
- ^ 「HAProxy 1.5 の変更ログ」 。2020年12 月 28 日閲覧。
- ^ 「ECH (Encrypted client hello) サポート · Issue #1924 · haproxy/haproxy」。GitHub。2023年7月 26 日閲覧。
- ^ 「OpenBSD 6.1 新機能」 。 2021年6月13日閲覧。
- ^ “src/lib/libtls/tls.c at master · openbsd/src”. GitHub . 2023年7月26日閲覧。
外部リンク
- RFC 6066 ( RFC 3546 を廃止した RFC 4366 を廃止)
- Mozilla Wiki - 暗号化クライアント Hello (ECH)
