HTTPS暗号化通信のパズルの最後のピース

王文暁

Web通信のセキュリティを強化するためには、データの暗号化が重要であり、それを可能にするプロトコルの一つがHTTPSです。しかし、HTTPSの接続確立プロセスには暗号化がなく、これがセキュリティ問題となることがあります。また、サーバーに複数のWebサイトが存在し、それぞれにSSL証明書がある場合、IPアドレスからどのサイトと接続を確立するかを判断するのは難しいです。これに対する解決方法として、CloudflareがECH(Encrypted Client Hello)という技術を導入しました。ECHを使用すれば、複数のWebサイトが存在するサーバーでも、アクセスのドメインなどのプライバシーを守ることが可能となります。

導入

HTTPS紹介

HTTPS = HTTP + TLS、HTTPはアプリケーション層のプロトコルです。TLSはセキュリティ・プロトコルです。だから理論的には、HTTPとTLSの機能を組み合わせたHTTPSは、データ伝送中が暗号化されています。しかし、TLSが接続を確立するプロセスは、暗号化されているわけではありません。

TLSハンドシェイク仕組み

暗号化されたHTTPメッセージをTLSで受け渡す前に、まずTLS接続を確立する必要があります。

TLSのバージョンによって、ハンドシェイクの手順は異なります。

出典:https://www.cloudflare.com/ja-jp/learning/ssl/what-happens-in-a-tls-handshake/

TLSハンドシェイク仕組みの欠点

ハンドシェイクの最初に。クライアントは、プロトコルのバージョン、クライアントランダム、暗号スイートのリスト,SNIを含む「Client Hello」メッセージを送信します。

SNI(Server Name Indication)には、ユーザーがアクセスしているウェブサイトのドメイン名が含まれます。インターネット・プロバイダーは、あなたが訪問するウェブサイトを監視することができます。内部ファイアウォールのアクセス制御とセキュリティポリシーなど機能は、SNI情報を分析することで実現されます。

https://www.prime-strategy.co.jp/にアクセスする時、ClientHelloのパケットキャプチャにドメイン名が表示されている。

なぜドメインは暗号化されないのですか?

一つのサーバーに複数の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://blog.cloudflare.com/announcing-encrypted-client-hello/

例えば、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/

<< KUSANAGI 9 が対応した HTTP/3 とはKUSANAGIプラグインの「自動更新」の紹介 >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解