Nâng cấp một listener lên TLS 1.3 thay đổi những gì người quan sát có thể đọc, nhưng không nhiều như số phiên bản gợi ý. ClientHello vẫn đi trước khi mọi mã hóa được thương lượng, và trong một kết nối thông thường tên máy chủ được yêu cầu nằm đó ở dạng văn bản rõ. Encrypted Client Hello là cơ chế che nó đi, và đây là một triển khai riêng với các điều kiện tiên quyết riêng. Hãy thực hiện bốn bước này trước khi viết một chính sách giả định một trong hai hành vi.

Điều gì thực sự bị lộ ra trong handshake

TLS 1.3 mã hóa chứng chỉ của máy chủ và phần lớn handshake theo sau ServerHello. Mọi thứ máy khách gửi trước tiên nằm ngoài sự bảo vệ đó, vì các khóa chưa tồn tại. Chỉ báo tên máy chủ là một phần của chuyến đi đầu tiên đó, nên một người quan sát thụ động vẫn có thể đọc nó mà không phá vỡ gì.

Đặc tả ECH, RFC 9849, thay đổi điều này bằng cách mã hóa một ClientHello bên trong cho máy chủ hợp tác. Handshake bên ngoài vẫn còn và mang một tên công khai mà mạng có thể thấy, vì vậy triển khai vẫn cần một danh tính bên ngoài có ý nghĩa với các trung gian. Tên bên ngoài đó là phần mà người ta bỏ sót khi kỳ vọng kết nối trở nên ẩn danh. Đó là một tên che chắn, không phải tên ẩn, và nó phải được phân giải và xác thực như bất kỳ tên nào khác.

Không điều nào trong số này che giấu đường phân phối. Địa chỉ nguồn và đích, cổng, kích thước gói và thời gian vẫn có thể quan sát được, và chúng thường nói nhiều hơn về ai đang nói chuyện so với cái tên. Phân giải tên và các mối quan hệ ở tầng ứng dụng là một lớp khác nữa, mỗi lớp có khả năng hiển thị riêng.

Đọc một ClientHello thay vì phỏng đoán

Phiên bản trong ServerHello không cho bạn biết máy khách đã gửi gì. Hãy xem trực tiếp chuyến đi đầu tiên, từ một vị trí đại diện cho người quan sát mà bạn quan tâm.

openssl s_client -connect app.plant.example:443 -servername app.plant.example -tls1_3 </dev/null> 2>/dev/null | head -20
sudo tcpdump -ni eth0 -c 40 'tcp port 443' -w /tmp/tls.pcap
tshark -r /tmp/tls.pcap -Y 'tls.handshake.extensions_server_name' -T fields -e tls.handshake.extensions_server_name

Lệnh đầu tiên thực hiện một handshake và hiển thị các tham số đã thương lượng, bao gồm phiên bản giao thức và tên bạn đã yêu cầu. Lệnh thứ hai ghi lại các gói đầu tiên của một kết nối thực, và lệnh thứ ba trích xuất trường SNI từ bản ghi đó. Nếu trường này có dữ liệu, người quan sát mà bạn mô phỏng có thể đọc nó.

Hãy ghi riêng ở phía máy khách và trên đường đi khi hai bên không khớp nhau, vì bản ghi cục bộ có thể hiển thị một tên mà middlebox sau đó ghi lại hoặc bỏ đi. Cũng hãy ghi từ một máy chủ không tự kết thúc TLS, vì một proxy kết thúc thấy văn bản rõ theo thiết kế và không chứng minh gì về những gì mạng thấy.

Coi tiện ích ECH là một tuyên bố, không phải bằng chứng

Thấy tiện ích ECH trong ClientHello không có nghĩa là kết nối đã dùng ECH. Máy khách gửi GREASE ECH khi không có cấu hình dùng được, chính xác để handshake của chúng trông đồng nhất. Tiện ích có mặt, hello bên trong là mồi nhử, và tên thật vẫn đọc được.

dig +short HTTPS app.plant.example
openssl s_client -connect app.plant.example:443 -tls1_3 -status </dev/null> 2>/dev/null | grep -i -E 'ech|status_request'

Lệnh đầu tiên cho biết nguồn gốc có công bố bản ghi tài nguyên HTTPS với tham số cấu hình ECH hay không, và đó là cách máy khách học khóa. Lệnh thứ hai tìm thông tin trạng thái của handshake, mặc dù thông điệp thành công của máy khách là bằng chứng mạnh hơn. Sự chấp nhận mới là điều quan trọng: một máy chủ không giữ khóa khớp thì không thể giải mã hello bên trong, và kết nối sẽ lùi lại.

Cũng hãy kiểm tra máy khách, vì hỗ trợ trình duyệt và cấu hình khác nhau theo phiên bản và nền tảng. Một chính sách dựa trên „trình duyệt hiện đại dùng ECH“ là phỏng đoán về một đội máy, không phải sự thật về đội máy của bạn. Hãy kiểm kê các phiên bản thực sự kết nối, rồi thử một cái của mỗi loại. Cùng một trang hoạt động từ trình duyệt máy tính hiện tại có thể không che giấu gì với một máy khách cũ hơn trên cùng mạng.

Viết phạm vi của người quan sát vào chính sách

Nêu rõ người quan sát ngồi ở đâu và những gì nhìn thấy ở điểm đó trước khi quyết định một biện pháp kiểm soát có thể dựa vào đâu. Kết nối của trình duyệt tới một trang web, một kênh VPN bên ngoài và một proxy kết thúc TLS mỗi thứ phơi ra một tập sự thật khác nhau, và một quy tắc viết cho một vị trí hiếm khi chuyển sạch sang vị trí khác.

Nếu một biện pháp kiểm soát phụ thuộc vào việc đọc SNI, hãy thử xem các máy khách đã triển khai hành xử thế nào khi ECH khả dụng và khi không. Sau đó ghi lại hệ quả về tương thích, vì một bộ lọc âm thầm ngừng khớp còn tệ hơn một bộ chưa từng được triển khai.

Cuối cùng, hãy giữ sự không chắc chắn trong hồ sơ. Thay một tuyên bố phổ quát cũ bằng một tuyên bố mới hơn để lại đúng khoảng trống đó dưới một tên giao thức khác, và người đánh giá tiếp theo sẽ tin nó chắc chắn như vậy.

Bài viết liên quan