Overview

Safe Browsing Oblivious HTTP Gateway API

Lưu ý: Tài liệu này hiện vẫn đang trong quá trình phát triển. Chúng tôi dự kiến sẽ cải thiện tính năng này trong thời gian sắp tới.

Safe Browsing Oblivious HTTP Gateway API là một API bảo đảm quyền riêng tư, được xây dựng dựa trên giao thức RFC của IETF có tên là Oblivious HTTP, RFC 9458.

Tổng quan

Safe Browsing Oblivious HTTP Gateway API là một dịch vụ của Google cho phép các ứng dụng khách kiểm tra URL dựa trên danh sách các tài nguyên web không an toàn được cập nhật liên tục của Google có các biện pháp bảo vệ quyền riêng tư bổ sung được áp dụng.

Việc này được thực hiện thông qua một giao thức gọn nhẹ có tên là Oblivious HTTP (HTTP Oblivious HTTP) hoặc gọi tắt là OHTTP. Đây là giao thức phi trạng thái mà các ứng dụng Duyệt web an toàn có thể sử dụng để truy cập vào Google Safe Browsing V5 API, nhằm có được các biện pháp bảo vệ mạnh mẽ và mở rộng phạm vi bảo vệ mà không ảnh hưởng đến người dùng quyền riêng tư.

LƯU Ý: Bạn không thể truy cập API Duyệt web An toàn của Google phiên bản 4 thông qua dịch vụ này.

Giao thức HTTP Oblivious của tính năng Duyệt web an toàn

Giao thức RFC

Oblivious HTTP là một giao thức nhẹ được xác định trong RFC 9458, dùng để mã hoá và gửi thông báo HTTP từ máy khách đến máy chủ đích. Tính năng này sử dụng dịch vụ chuyển tiếp đáng tin cậy theo cách giảm thiểu việc máy chủ đích sử dụng siêu dữ liệu, chẳng hạn như địa chỉ IP và thông tin kết nối để nhận dạng ứng dụng khách, đảm bảo quyền riêng tư và tính bảo mật so với giao thức HTTP/S thuần tuý. Giao thức sử dụng HTTP nhị phân, được xác định trong RFC 9292, để mã hoá/giải mã các yêu cầu/phản hồi HTTP.

Ở cấp độ cao, Relay đứng giữa tài nguyên Ứng dụng và Cổng vào để proxy lưu lượng truy cập ứng dụng khách bằng cách xoá tất cả giá trị nhận dạng ứng dụng khách, bao gồm cả các thuộc tính nhạy cảm về quyền riêng tư như địa chỉ IP, ẩn danh hiệu quả các yêu cầu HTTP gửi đến dịch vụ Cổng vào. Lợi ích bổ sung của OHTTP là tất cả các yêu cầu đều được mã hoá hai đầu, có nghĩa là yêu cầu của khách hàng Truy vấn Duyệt web an toàn (tức là hàm băm bị cắt bớt của biểu thức URL) không hiển thị với Relay. Tham khảo blogpost này để xem ví dụ về cách triển khai trong Chrome.

Cấu trúc tổng thể của dịch vụ.
Hình: Quy trình OHTTP.

Khách hàng có thể chọn bất kỳ nhà cung cấp dịch vụ Chuyển tiếp nào (ví dụ: Fastly) để tích hợp với dịch vụ. Trình chuyển tiếp phải sử dụng phương thức xác thực Oauth 2.0 với phạm vi cấp phép sau để truy cập dịch vụ.


// OAuth Authorization scope: https://www.googleapis.com/auth/3p-relay-safe-browsing
Điểm cuối API
Khoá công khai OHTTP

Điểm cuối này sẽ cung cấp cấu hình khoá công khai OHTTP như chỉ định trong RFC 9458. Cấu hình này sẽ được ứng dụng sử dụng để mã hoá yêu cầu OHTTP.


GET https://safebrowsingohttpgateway.googleapis.com/v1/ohttp/hpkekeyconfig?key=<API key>

Khoá API ở trên không hoàn toàn cần thiết; máy chủ không thay đổi Khoá công khai OHTTP dựa trên khoá API đã cung cấp. Ứng dụng được phép thăm dò thực tế này bằng cách sử dụng nhiều khoá API hợp lệ để truy cập vào điểm cuối này hoặc không sử dụng hoàn toàn khoá API nào, đồng thời kiểm tra để đảm bảo phản hồi thực sự chứa cùng một khoá công khai OHTTP. Tuy nhiên, để dễ dàng gỡ lỗi, bạn nên dùng khoá API; việc này cho phép khách hàng xem số liệu thống kê, chẳng hạn như số lượng yêu cầu trên Google Cloud Console. Nếu ứng dụng khách định cung cấp khoá API, hãy tham khảo tài liệu này về cách thiết lập khoá API.

Như đã nêu trong phần đề xuất về quyền riêng tư, để đáp ứng các mục tiêu về tính nhất quán của khoá, nhà cung cấp khách hàng nên thiết lập cơ sở hạ tầng phân phối khoá tập trung để tìm nạp khoá từ điểm cuối này rồi phân phối khoá cho các ứng dụng khách.

Theo hướng dẫn quản lý khoá, các khoá được xoay vòng thường xuyên trên máy chủ. Ứng dụng nên làm mới khoá (tức là tìm nạp và cập nhật bản sao cục bộ của khoá thường xuyên) để tránh lỗi giải mã.

Ứng dụng nên làm mới (tìm nạp và cập nhật) khoá công khai mỗi ngày một lần. Nếu bạn đang sử dụng cơ chế phân phối tập trung, thì cơ chế này phải đảm bảo tìm nạp và phân phối khoá một lần mỗi ngày.

Yêu cầu OHTTP được đóng gói

Điểm cuối này sẽ phân phát yêu cầu OHTTP có trong phần nội dung HTTP của yêu cầu POST, bằng cách giải mã yêu cầu, sau đó mã hoá phản hồi OHTTP để được chuyển tiếp trở lại Chuyển tiếp trong phản hồi HTTP. Ứng dụng phải bao gồm tiêu đề yêu cầu Content-Type dưới dạng message/ohttp-req trong yêu cầu POST qua HTTP.


POST https://safebrowsingohttpgateway.googleapis.com/v1/ohttp:handleOhttpEncapsulatedRequest?key=<API key>

LƯU Ý: Theo hướng dẫn về RFC, hãy mã hoá yêu cầu bên trong (tham khảo tài liệu phiên bản V5 về cách xây dựng yêu cầu Duyệt web an toàn) bằng giao thức HTTP nhị phân, RFC 9292.

Thư viện ứng dụng

Google Quiche có các biện pháp triển khai phía máy khách cho cả giao thức OHTTPBHTTP. Ứng dụng nên sử dụng các thư viện này. Hãy tham khảo đoạn mã giả dưới đây để biết cách xây dựng các yêu cầu OHTTP để truy cập API.

Triển khai phía máy khách mẫu

Các ứng dụng tìm nạp khoá công khai HTTP Oblivious từ điểm cuối khoá công khai. Sau đó, hãy khởi chạy cấu hình khoá OHTTP quiche như vậy và khởi chạy ứng dụng OHTTP quiche.


auto ohttp_key_cfgs = quiche::ObliviousHttpKeyConfigs::ParseConcatenatedKeys(std::string public_key); auto key_config = ohttp_key_cfgs->PreferredConfig(); auto public_key = ohttp_key_cfgs->GetPublicKeyForId(key_config.GetKeyId()) auto ohttp_client = quiche::ObliviousHttpClient::Create(public_key, key_config);

Ứng dụng khách sẽ sử dụng phương thức mã hoá HTTP nhị phân để tạo Yêu cầu BHTTP làm bước đầu tiên trước khi mã hoá.


quiche::BinaryHttpRequest::ControlData bhttp_ctrl_data{ .method = "POST", .scheme = "https", .authority = "safebrowsing.googleapis.com", .path = "/v5/hashes:search?key=<API key>&hashPrefixes=<HASH prefix 1>&hashPrefixes=<HASH prefix 2>", }; quiche::BinaryHttpRequest bhttp_request(bhttp_ctrl_data);

Sau đó, Ứng dụng sẽ mã hoá yêu cầu HTTP nhị phân được tạo ở bước trên.


auto bhttp_serialized = bhttp_request.Serialize(); auto ohttp_request = ohttp_client.CreateObliviousHttpRequest(*bhttp_serialized); // Client must include this in POST body, and add `Content-Type` header as "message/ohttp-req". auto payload_include_in_post_body = ohttp_request.EncapsulateAndSerialize();

Sau khi nhận được phản hồi từ Relay, ứng dụng sẽ giải mã phản hồi đó. Phản hồi sẽ bao gồm tiêu đề phản hồi Content-Type dưới dạng ohttp-res.


auto ctx = std::move(ohttp_request).ReleaseContext(); auto ohttp_response = ohttp_client.DecryptObliviousHttpResponse("data included in body of http_response", ctx);

Sau khi giải mã phản hồi OHTTP thành công, hãy giải mã đầu ra bằng HTTP nhị phân như vậy.


auto bhttp_response = BinaryHttpResponse::Create(ohttp_response.GetPlaintextData()); if (bhttp_response.status_code() == 200) { auto http_response = bhttp_response.body(); auto response_headers = bhttp_response.GetHeaderFields(); }