Overview

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

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

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

खास जानकारी

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

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

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

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

RFC प्रोटोकॉल

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

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

सेवा की पूरी बनावट.
Fig: ओएचटीटीपी फ़्लो.

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


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

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


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

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

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

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

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

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 कुंजी कॉन्फ़िगरेशन को इस तरह शुरू करें और 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);

एन्क्रिप्ट करने से पहले, क्लाइंट पहले चरण के तौर पर 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 प्रतिक्रिया को सफलतापूर्वक डिक्रिप्ट करने के बाद, आउटपुट को डीकोड करने के लिए बाइनरी 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(); }