API دروازه HTTP نادیده مرور ایمن
توجه: این مستندات در حال حاضر در حال توسعه است. انتظار پیشرفت در آینده نزدیک را داشته باشید.
Safe Browsing Oblivious HTTP Gateway API یک API حفظ حریم خصوصی است که بر روی پروتکل IETF RFC به نام Oblivious HTTP ، RFC 9458 ساخته شده است.
نمای کلی
Safe Browsing Oblivious HTTP Gateway API یک سرویس Google است که به برنامههای سرویس گیرنده اجازه میدهد URLها را در برابر فهرستهای دائماً بهروز شده منابع وب ناامن Google با حفاظت از حریم خصوصی اضافی بررسی کنند.
این از طریق یک پروتکل سبک وزن به نام Oblivious HTTP یا به اختصار OHTTP به دست می آید. این یک پروتکل بدون حالت است که میتواند توسط کلاینتهای Safe Browsing برای دسترسی به APIهای Google Safe Browsing V5 استفاده شود، تا از محافظتهای قوی و افزایش پوشش بدون به خطر انداختن حریم خصوصی کاربران استفاده کنند.
توجه: APIهای Google Safe Browsing V4 از طریق این سرویس قابل دسترسی نیستند.
پروتکل HTTP نادیده مرور ایمن
پروتکل RFC
Oblivious HTTP یک پروتکل سبک است که در RFC 9458 تعریف شده است که برای رمزگذاری و ارسال پیام های HTTP از یک کلاینت به یک سرور هدف استفاده می شود. این کار از یک سرویس رله قابل اعتماد استفاده می کند به نحوی که استفاده سرور مورد نظر از ابرداده مانند آدرس IP و اطلاعات اتصال را برای شناسایی مشتری کاهش می دهد و حریم خصوصی و امنیت را در بالای پروتکل HTTP/S ساده فراهم می کند. این پروتکل از HTTP باینری، تعریف شده در RFC 9292، برای رمزگذاری/رمزگشایی درخواست ها/پاسخ های HTTP استفاده می کند.
در سطح بالایی، یک Relay بین منبع Client و Gateway قرار می گیرد که با حذف همه شناسه های مشتری، از جمله ویژگی های حساس به حریم خصوصی مانند آدرس های IP، به طور موثر درخواست های HTTP ورودی به سرویس Gateway را ناشناس می کند، ترافیک مشتری را پراکسی می کند. مزیت اضافه شده OHTTP این است که تمام درخواستها رمزگذاری شدهاند، به این معنی که پرسوجوهای مرور ایمن کلاینتها (یعنی هشهای کوتاهشده عبارات URL) برای Relay قابل مشاهده نیستند. برای اجرای نمونه در کروم به وبلاگ پست مراجعه کنید.
مشتریان می توانند هر ارائه دهنده Relay (به عنوان مثال، Fastly ) را برای ادغام با سرویس انتخاب کنند. رله باید از احراز هویت Oauth 2.0 با محدوده مجوز زیر برای دسترسی به سرویس استفاده کند.
// OAuth Authorization scope:
https://www.googleapis.com/auth/3p-relay-safe-browsing
نقاط پایانی API
کلید عمومی OHTTP
این نقطه پایانی پیکربندی کلید عمومی OHTTP را همانطور که در RFC 9458 مشخص شده است، ارائه میکند که توسط مشتری برای رمزگذاری درخواست OHTTP استفاده میشود.
GET https://safebrowsingohttpgateway.googleapis.com/v1/ohttp/hpkekeyconfig?key=<API key>
کلید API بالا به شدت ضروری نیست. سرور کلید عمومی OHTTP را بر اساس کلید API ارائه شده تغییر نمی دهد. برای کلاینتها مجاز است که این واقعیت را با استفاده از کلیدهای معتبر API مختلف برای دسترسی به این نقطه پایانی یا استفاده از هیچ کلید API بررسی کنند و بررسی کنند که آیا پاسخ واقعاً حاوی کلید عمومی OHTTP است. با این حال، برای سهولت اشکال زدایی، یک کلید API توصیه می شود. این به مشتریان اجازه میدهد تا آماری مانند تعداد درخواستها را در Google Cloud Console مشاهده کنند. اگر مشتری قصد دارد یک کلید API ارائه کند، به این مستندات در مورد نحوه تنظیم کلیدهای API مراجعه کنید.
همانطور که در بخش توصیههای حفظ حریم خصوصی بیان شد، به منظور دستیابی به اهداف اصلی سازگاری ، به فروشندگان مشتری توصیه میشود که یک زیرساخت توزیع کلید متمرکز راهاندازی کنند تا کلید را از این نقطه پایانی دریافت کنند و متعاقباً آن را در برنامههای مشتری خود توزیع کنند.
طبق دستورالعمل مدیریت کلید ، کلیدها به طور منظم روی سرور می چرخند. کلاینتها باید کلید را تازهسازی کنند، بهعنوان مثال، هر چند وقت یکبار کپی محلی کلید را واکشی و بهروزرسانی کنند تا از شکستهای رمزگشایی جلوگیری شود.
مشتریان باید کلید عمومی را یک بار در روز بازخوانی کنند (واکشی و به روز کنند). اگر یک مکانیسم توزیع متمرکز استفاده می شود، این مکانیسم باید مطمئن شود که کلیدها یک بار در روز دریافت و توزیع می شوند.
درخواست کپسوله شده OHTTP
این نقطه پایانی با انجام رمزگشایی درخواست، درخواست OHTTP را که در بدنه HTTP درخواست POST گنجانده شده است، ارائه میکند و متعاقباً پاسخ OHTTP را رمزگذاری میکند تا در پاسخ HTTP به Relay بازگردانده شود. مشتری باید سرصفحه درخواست Content-Type را به عنوان پیام/ohttp-req در درخواست HTTP POST درج کند.
POST https://safebrowsingohttpgateway.googleapis.com/v1/ohttp:handleOhttpEncapsulatedRequest?key=<API key>
توجه: طبق راهنمایی در مورد RFC، درخواست داخلی (به مستندات V5 در مورد نحوه ایجاد درخواست مرور ایمن مراجعه کنید) با استفاده از پروتکل HTTP باینری ، RFC 9292 کدگذاری کنید.
کتابخانه های مشتری
Google Quiche دارای پیاده سازی سمت مشتری برای پروتکل های OHTTP و BHTTP است. به مشتریان توصیه می شود از این کتابخانه ها استفاده کنند. به شبه کد زیر در مورد نحوه ساخت درخواست های OHTTP برای دسترسی به API مراجعه کنید.
نمونه اجرای سمت مشتری
کلاینت ها کلید عمومی Oblivious HTTP را از نقطه پایانی کلید عمومی واکشی می کنند. متعاقباً پیکربندی کلید OHTTP quiche را مانند این مقداردهی اولیه کنید و کلاینت quiche OHTTP را مقداردهی اولیه کنید.
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);
مشتری از رمزگذاری HTTP باینری برای ایجاد درخواست BHTTP به عنوان اولین گام قبل از رمزگذاری استفاده می کند.
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);
مشتری متعاقباً درخواست باینری HTTP ایجاد شده در مرحله بالا را رمزگذاری می کند.
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();
هنگامی که پاسخ از Relay دریافت شد، کلاینت پاسخ را رمزگشایی می کند. پاسخ شامل سرصفحه پاسخ Content-Type به عنوان ohttp-res خواهد بود.
auto ctx = std::move(ohttp_request).ReleaseContext();
auto ohttp_response = ohttp_client.DecryptObliviousHttpResponse("data included in body of http_response", ctx);
پس از رمزگشایی پاسخ OHTTP با موفقیت، خروجی را با استفاده از HTTP باینری رمزگشایی کنید.
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();
}