導入
HTTPS紹介
HTTPS = HTTP + TLS、HTTPはアプリケーション層のプロトコルです。TLSはセキュリティ・プロトコルです。だから理論的には、HTTPとTLSの機能を組み合わせたHTTPSは、データ伝送中が暗号化されています。しかし、TLSが接続を確立するプロセスは、暗号化されているわけではありません。
TLSハンドシェイク仕組み
暗号化されたHTTPメッセージをTLSで受け渡す前に、まずTLS接続を確立する必要があります。
TLSのバージョンによって、ハンドシェイクの手順は異なります。
TLSハンドシェイク仕組みの欠点
ハンドシェイクの最初に。クライアントは、プロトコルのバージョン、クライアントランダム、暗号スイートのリスト,SNIを含む「Client Hello」メッセージを送信します。
SNI(Server Name Indication)には、ユーザーがアクセスしているウェブサイトのドメイン名が含まれます。インターネット・プロバイダーは、あなたが訪問するウェブサイトを監視することができます。内部ファイアウォールのアクセス制御とセキュリティポリシーなど機能は、SNI情報を分析することで実現されます。
なぜドメインは暗号化されないのですか?
一つのサーバーに複数のWebサイトがあります、各Webサイトが独自のSSL証明書を持つ場合、IPアドレスからクライアントがどのWebサイトとTLS接続を確立したいのかを判断することはできず、この時、ドメインの判断を補助する必要があります。
このような場合、どのようにアクセスのドメインなどプライバシーを守ればよいですか?
紹介
CloudflareはECH(Encrypted Client Hello )と呼ばれる技術を使用することでこの問題を解決しました。
Encrypted Client Hello (ECH) プロトコルはTLS 1.3に導入された拡張である。ECHの目標は、TLS 1.3との互換性を維持しながら、TLSハンドシェーク・プロセスのプライバシーとパフォーマンスを向上させることである。現在、Nginx、Apacheなどウェブサーバー、Firefox、Chromium などブラウザー、Cloudflareなどサービスプロバイダーは、すでにECHをサポートしています。
以下のウェブサイトは、Tolerant Networks Limited が提供しているドメイン使用してECH が使用されたかどうかを確認できます。
https://defo.ie/ech-check.php
defo.ie では、次のことができます:
- ECH の導入と展開に関する経験を参照する。
- ECH が使用されたかどうかを確認する。
- TLS Encrypted ClientHello(ECH)の相互運用性をさまざまな実装間でテストする。
ECHがオフの場合
client helloのパケットキャプチャにドメイン名が表示されています。
ECHがオンの場合
上のウェブページと同じでした。client helloにはcover.defo.ieと表示されているが、実際にアクセスしたドメイン名はdefo.ieです。
実際のドメイン名は、パケットキャプチャで取得できなくなりました。cover.defo.ieは最終アクセスのドメインではないので、監視されたのも大丈夫です。
原理
利用方法
ECHを使用するには、クライアント部分とクライアントの両方を適宜調整する必要があります。
1、chromeやFirefoxなどブラウザを最新のバージョンにアップグレードします。
2、DoH(DNS over HTTPS)をサポートするDNSサーバーを使用します。cloudflareのDNS 1.1.1.1をお勧めします。
3、CloudflareにアクセスしてSSLのECH機能がオンにします。
上記ステップを実行してから、完全なプライバシーでウェブサイトをアクセスすることができます。
解析
ECHがどのように機能するかを説明します。ECH では、ClientHello メッセージ部分です。内部部分[ClientHelloInner]と外部部分[ClientHelloOuter]の 2 つの個別のメッセージに分割されます。外側の部分には、使用するECHのドメインやTLSバージョンなどの機密性の低い情報が含まれています。内部部分には、実際のアクセス・ドメインなどの情報を含まれています。ECHサーバーの公開鍵を使って暗号化されています。
例えば、https://prime-strategy.co.jpにアクセスするときは、
1、まずcloudflareーDNSからIP、ECHサーバーの公開鍵を取得し、公開鍵でprime-strategy.co.jpなど情報を含まれるClientHelloInnerを暗号化します。ClientHelloOuterにcloudflare-echなど情報を入れます。
2、cloudflare-echサーバーは秘密鍵でClientHelloInnerを復号化し、ドメイン名に対応するウェブサイトを見つけます。
3、後は通常の HTTPS と同じようにハンドシェイクします。
外部から監視できるのは、暗号化されていないClientHelloOuterの情報だけであり、ClientHelloInnerの情報は暗号化されているため監視できない。
最後
1、記事作成時、ECH機能がある事情により一時的に停止していますが、Cloudflareはできるだけ早く問題を解決してオープンするようです。
2、一つ懸念点あります。cloudflare-ech.comが故障になった場合、関連のECHするすべてのサイトにアクセスできなくなります。Cloudflareは世界最大のCDNプロバイダーであり、問題が起きれば大きな影響が出る可能性があります。
参考
https://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-08
https://developers.cloudflare.com/ssl/edge-certificates/ech/
https://blog.cloudflare.com/announcing-encrypted-client-hello/
https://www.cloudflare.com/ja-jp/learning/ssl/what-happens-in-a-tls-handshake/