Slide 1

Slide 1 text

TLS Encrypted Client Hello (ECH) conformance test with Ruby @Gotanda.rb #61 2025/01/28 桒山智耶 thekuwayama

Slide 2

Slide 2 text

自己紹介 - 桒山智耶 - thekuwayama - Nature株式会社 - バックエンド

Slide 3

Slide 3 text

目次 1. ECH の概要 2. echspec とは 3. echspec の構成 4. echspec でやったこと

Slide 4

Slide 4 text

ECH の概要

Slide 5

Slide 5 text

ECH の概要 - Encrypted Client Hello - TLS 拡張の新しい提案仕様 - https://datatracker.ietf.org/doc/draft-ietf-tls-esni/ - 2025/01 現在、IETF の TLS WG にて議論中

Slide 6

Slide 6 text

クライアント サーバ ClientHello Finished ServertHello EncryptedExtensions Certificate CertificateVerify Finished

Slide 7

Slide 7 text

クライアント サーバ ClientHello Finished ServertHello EncryptedExtensions Certificate CertificateVerify Finished ● SNI

Slide 8

Slide 8 text

ECH の概要 - TLS ハンドシェイクメッセージ Client Hello は平文 - Client Hello には平文の SNI 拡張が含まれる - Server Name Indication - 第三者は SNI を観測することでクライアントがアクセスしようとしている Web サイトなどを特定でき る - プライバシー

Slide 9

Slide 9 text

ECH の概要 - TLS ハンドシェイクメッセージ Client Hello は平文 - Client Hello には平文の SNI 拡張が含まれる - Server Name Indication - 第三者は SNI を観測することでクライアントがアクセスしようとしている Web サイトなどを特定でき る - プライバシー - Client Hello を暗号化して ECH 拡張に詰める

Slide 10

Slide 10 text

クライアント サーバ ClientHello Finished ServertHello EncryptedExtensions Certificate CertificateVerify Finished ● SNI

Slide 11

Slide 11 text

クライアント サーバ ClientHello Finished ServertHello EncryptedExtensions Certificate CertificateVerify Finished ● SNI ● ECH

Slide 12

Slide 12 text

ECH の概要 ClientHello { SNI: “cloudflare-ech.com” ECH: “...” } 通信相手は cloudflare-ech.com のように見える パディングなどした後、暗号化した ClientHello など - ECH 拡張を含む Client Hello の概略

Slide 13

Slide 13 text

ECH の概要 - Client Hello を暗号化して ECH 拡張に詰める - 暗号化には HPKE を用いる - https://datatracker.ietf.org/doc/rfc9180/ - 公開鍵などを含む ECHConfig は HTTPS RR で配ることが検討されている - https://datatracker.ietf.org/doc/rfc9460/ - https://datatracker.ietf.org/doc/draft-ietf-tls-svcb-ech/

Slide 14

Slide 14 text

ECH の概要 - TLS ライブラリにおける実装状況 - https://github.com/tlswg/draft-ietf-tls-esni/wiki/Implementations - openssl/openssl - https://github.com/openssl/openssl/tree/feature/ech - rustls - https://github.com/rustls/rustls/pull/2104 - golang/go - https://github.com/golang/go/tree/go1.24rc2

Slide 15

Slide 15 text

echspec とは

Slide 16

Slide 16 text

echspec とは - https://github.com/thekuwayama/echspec - A conformance testing tool for ECH implementation. - Ruby で実装した - ECH を有効化した TLS のクライアントとして動作 - サーバとハンドシェイクを試みる - ハンドシェイクの過程でサーバが ECH の仕様に沿った実装になっているかチェック

Slide 17

Slide 17 text

The client-facing server computes ClientHelloInner by reversing this process. First it parses EncodedClientHelloInner, interpreting all bytes after client_hello as padding. If any padding byte is non-zero, the server MUST abort the connection with an "illegal_parameter" alert. https://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-22#section-5.1-9 echspec とは

Slide 18

Slide 18 text

echspec とは - 例えば、クライアントから送信されるメッセージの 0 パディング部分が 0 以外でパ ディングされていた場合、サーバは illegal_parameter アラートを返してハンドシェ イクを中止する (MUST) - echspec ではテストケース - EncodedClientHelloInner を 0 以外でパディングして送信 - illegal_parameter アラート返送されることをチェック

Slide 19

Slide 19 text

クライアント サーバ ClientHello Alert ● SNI ● ECH 0 以外でパディングした EncodedClientHelloInner を利用 illegal_parameter ? 👀

Slide 20

Slide 20 text

echspec の構成

Slide 21

Slide 21 text

echspec の構成 - echspec - https://github.com/thekuwayama/echspec - ech_config - https://github.com/thekuwayama/ech_config - tttls1.3 - https://github.com/thekuwayama/tttls1.3 - hpke-rb - https://github.com/sylph01/hpke-rb - openssl - https://github.com/ruby/openssl

Slide 22

Slide 22 text

echspec tttls1.3 hpke-rb ruby/openssl openssl/openssl echspec の構成 ech_config

Slide 23

Slide 23 text

echspec tttls1.3 hpke-rb ruby/openssl openssl/openssl echspec の構成 自作 ech_config 自作 自作

Slide 24

Slide 24 text

echspec tttls1.3 hpke-rb ruby/openssl openssl/openssl echspec の構成 TLS1.3 ECH HPKE RSA, AEAD, X.509, Hash, etc conformance testing tool ech_config

Slide 25

Slide 25 text

echspec tttls1.3 hpke-rb ruby/openssl openssl/openssl echspec の構成 Ruby C 拡張 ech_config

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

echspec でやったこと

Slide 28

Slide 28 text

echspec でやったこと - golang/go へのパッチが取り込まれました!! 🎉🎉 - https://go-review.googlesource.com/c/go/+/639235

Slide 29

Slide 29 text

echspec でやったこと - 動的な解析 - 書き換える ⇄ 試す - ハンドシェイクメッセージログの出力 - 暗号化された ClientHello (ClientHelloInner) - client,server_handshake_traffic_secret で暗号化されたハンドシェイクメッセージ - ハンドシェイクの過程を読める - 目的をもって TLS ECH 実装のソースコードを読める

Slide 30

Slide 30 text

まとめ - Ruby で ECH の仕様準拠テストツールを実装した - 楽しい!! 👍👍 - 今後 - テストケースを増やしていきたい - 他の ECH 実装についても仕様準拠テストしていきたい