Overview

सुरक्षित ब्राउज़िंग ऑब्लिवियस एचटीटीपी गेटवे एपीआई

ध्यान दें: फ़िलहाल, इस दस्तावेज़ पर काम चल रहा है. आने वाले समय में इसमें सुधार हो सकता है.

सुरक्षित ब्राउज़िंग ऑब्लिवियस एचटीटीपी गेटवे एपीआई, निजता बनाए रखने वाला एक एपीआई है. यह Oblivious HTTP, RFC 9458 नाम के IETF आरएफ़सी प्रोटोकॉल पर बना है.

खास जानकारी

सुरक्षित ब्राउज़िंग ऑब्लिवियस एचटीटीपी गेटवे एपीआई, Google की ऐसी सेवा है जिसकी मदद से क्लाइंट ऐप्लिकेशन, Google की लगातार अपडेट होने वाली असुरक्षित वेब संसाधनों की सूची में शामिल यूआरएल की जांच कर पाते हैं. इन सूचियों में, निजता की सुरक्षा के लिए अतिरिक्त सुरक्षा दी जाती है.

यह प्रोसेस, Oblivious HTTP या शॉर्ट वीडियो OHTTP नाम के एक लाइटवेट प्रोटोकॉल के ज़रिए की जाती है. यह एक स्टेटलेस प्रोटोकॉल है. इसका इस्तेमाल सुरक्षित ब्राउज़िंग के क्लाइंट, Google सुरक्षित ब्राउज़िंग V5 एपीआई को ऐक्सेस करने के लिए कर सकते हैं. इससे उपयोगकर्ताओं से समझौता किए बिना, उनकी बेहतर सुरक्षा और ज़्यादा कवरेज मिलती है निजता.

ध्यान दें: Google सुरक्षित ब्राउज़िंग V4 API को इस सेवा से ऐक्सेस नहीं किया जा सकता.

सुरक्षित ब्राउज़िंग ऑब्लिवियस एचटीटीपी प्रोटोकॉल

आरएफ़सी प्रोटोकॉल

ऑब्लिवियस एचटीटीपी आरएफ़सी 9458 में बताया गया एक लाइटवेट प्रोटोकॉल है. इसका इस्तेमाल क्लाइंट के एचटीटीपी मैसेज को एन्क्रिप्ट (सुरक्षित) करने और टारगेट सर्वर पर भेजने के लिए किया जाता है. यह भरोसेमंद रिले सेवा का इस्तेमाल इस तरह करता है कि टारगेट सर्वर, क्लाइंट की पहचान के लिए आईपी पते और कनेक्शन की जानकारी जैसे मेटाडेटा के इस्तेमाल को कम कर देता है. साथ ही, सामान्य एचटीटीपी/एस प्रोटोकॉल के अलावा, निजता और सुरक्षा की सुविधा भी देता है. यह प्रोटोकॉल, एचटीटीपी अनुरोधों/रिस्पॉन्स को कोड में बदलने/डिकोड करने के लिए, आरएफ़सी 9292 में बताए गए बाइनरी एचटीटीपी का इस्तेमाल करता है.

बड़े लेवल पर, एक रिले, क्लाइंट और गेटवे रिसॉर्स के बीच में खड़ा होता है. यह सभी क्लाइंट आइडेंटिफ़ायर को हटाकर, क्लाइंट ट्रैफ़िक को प्रॉक्सी करता है. इनमें आईपी पते जैसे निजता से जुड़े संवेदनशील एट्रिब्यूट भी शामिल हैं. इससे, गेटवे सेवा पर आने वाले एचटीटीपी अनुरोधों की पहचान बेहतर तरीके से की जाती है. OHTTP का एक और फ़ायदा यह है कि इसके सभी अनुरोध पूरी तरह सुरक्षित (E2EE) होते हैं. इसका मतलब है कि रिले को सुरक्षित ब्राउज़िंग क्वेरी नहीं दिखती हैं. जैसे, यूआरएल एक्सप्रेशन के काटे गए हैश. Chrome में इसे लागू करने का उदाहरण देखने के लिए, blogpost पर जाएं.

सेवा का पूरा आर्किटेक्चर.
इमेज: ओएचटीटीपी फ़्लो.

क्लाइंट, रिले सेवा देने वाली किसी भी कंपनी को चुन सकते हैं (उदाहरण के लिए, Fastly). सेवा को ऐक्सेस करने के लिए, रिले को अनुमति के दायरे के साथ Oauth 2.0 की पुष्टि करनी होगी.


// OAuth Authorization scope: https://www.googleapis.com/auth/3p-relay-safe-browsing
एपीआई एंडपॉइंट
OHTTP सार्वजनिक कुंजी

यह एंडपॉइंट, OHTTP सार्वजनिक पासकोड का कॉन्फ़िगरेशन देगा, जैसा कि आरएफ़सी 9458 में बताया गया है. इसका इस्तेमाल क्लाइंट, OHTTP अनुरोध को एन्क्रिप्ट करने के लिए करेगा.


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

ऊपर दी गई एपीआई कुंजी ज़रूरी नहीं है; सर्वर, दी गई एपीआई कुंजी के आधार पर OHTTP सार्वजनिक कुंजी में बदलाव नहीं करता. क्लाइंट इस एंडपॉइंट को ऐक्सेस करने के लिए अलग-अलग मान्य एपीआई पासकोड या बिना किसी एपीआई पासकोड का इस्तेमाल करके, इस तथ्य की जांच कर सकते हैं. साथ ही, यह जांच कर सकते हैं कि रिस्पॉन्स में वाकई एक ही OHTTP सार्वजनिक कुंजी शामिल है या नहीं. हालांकि, डीबग करने में आपको आसानी के लिए, एपीआई पासकोड का इस्तेमाल करने का सुझाव दिया जाता है; इससे क्लाइंट Google Cloud Console पर अनुरोधों की संख्या जैसे आंकड़े देख सकते हैं. अगर क्लाइंट को एपीआई पासकोड उपलब्ध कराना है, तो एपीआई पासकोड सेट अप करने का तरीका जानने के लिए, यह दस्तावेज़ देखें.

जैसा कि निजता से जुड़े सुझाव सेक्शन में बताया गया है, एक जैसी समानता वाले लक्ष्यों को पूरा करने के लिए, क्लाइंट वेंडर को सेंट्रलाइज़्ड कुंजी डिस्ट्रिब्यूशन इन्फ़्रास्ट्रक्चर सेट अप करना चाहिए. इससे पासकोड को इस एंडपॉइंट से फ़ेच किया जा सकेगा और उसे अपने क्लाइंट ऐप्लिकेशन में डिस्ट्रिब्यूट किया जा सकेगा.

की मैनेजमेंट से जुड़े दिशा-निर्देश के मुताबिक, सर्वर पर पासकोड को नियमित तौर पर बदला जाता है. क्लाइंट को कुंजी को रीफ़्रेश करना चाहिए, जैसे कि कुंजी की लोकल कॉपी को समय-समय पर फ़ेच करना चाहिए और अपडेट करना चाहिए, ताकि डिक्रिप्शन गड़बड़ी से बचा जा सके.

क्लाइंट को हर दिन एक बार सार्वजनिक पासकोड को रीफ़्रेश (फ़ेच और अपडेट) करना चाहिए. अगर सेंट्रलाइज़्ड डिस्ट्रिब्यूशन का तरीका इस्तेमाल किया जा रहा है, तो इस तरीके से यह पक्का किया जाना चाहिए कि हर दिन एक बार कुंजियां फ़ेच और डिस्ट्रिब्यूट की जा रही हों.

OHTTP एनकैप्सुलेट किया गया अनुरोध

यह एंडपॉइंट, अनुरोध को डिक्रिप्ट करके उस OHTTP अनुरोध को सेवा देगा जो पोस्ट अनुरोध के एचटीटीपी बॉडी में शामिल है. इसके लिए, अनुरोध को डिक्रिप्ट करेगा और बाद में एचटीटीपी रिस्पॉन्स में, रिले पर भेजे जाने वाले OHTTP रिस्पॉन्स को एन्क्रिप्ट (सुरक्षित) करेगा. क्लाइंट को एचटीटीपी पोस्ट अनुरोध में Content-Type अनुरोध हेडर को message/ohttp-req के रूप में शामिल करना चाहिए.


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

ध्यान दें: आरएफ़सी के दिशा-निर्देशों के मुताबिक, बाइनरी एचटीटीपी प्रोटोकॉल आरएफ़सी 9292 का इस्तेमाल करके, इनर रिक्वेस्ट (सुरक्षित ब्राउज़िंग का अनुरोध करने के तरीके से जुड़ा V5 दस्तावेज़ देखें) को कोड में बदलें.

क्लाइंट लाइब्रेरी

Google Quiche में, OHTTP और BHTTP, दोनों प्रोटोकॉल के लिए क्लाइंट साइड लागू किए जाते हैं. क्लाइंट को इन लाइब्रेरी का इस्तेमाल करने का सुझाव दिया जाता है. एपीआई ऐक्सेस करने के लिए, OHTTP अनुरोध बनाने का तरीका जानने के लिए नीचे दिया गया pseudo-code देखें.

क्लाइंट साइड को लागू करने का सैंपल

क्लाइंट, सार्वजनिक पासकोड एंडपॉइंट से ऑब्लिवियस एचटीटीपी सार्वजनिक पासकोड फ़ेच करते हैं. इसके बाद, इस तरह की तरह quiche OHTTP कुंजी वाला कॉन्फ़िगरेशन शुरू करें और kiche 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);

एन्क्रिप्ट करने से पहले, क्लाइंट पहले चरण के तौर पर 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);

क्लाइंट, ऊपर दिए गए चरण में बनाए गए बाइनरी एचटीटीपी अनुरोध को एन्क्रिप्ट (सुरक्षित) करेगा.


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();

रिले से जवाब मिलने के बाद, क्लाइंट उसे डिक्रिप्ट करेगा. इस जवाब में 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 रिस्पॉन्स को डिक्रिप्ट करने के बाद, बाइनरी एचटीटीपी का इस्तेमाल करके आउटपुट को डिकोड करें.


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(); }