Overview

Güvenli Tarama Oblivious HTTP Gateway API'si

Not: Bu doküman şu anda hâlâ geliştirme aşamasındadır. Yakın gelecekte iyileştirmeler yapılabilir.

Güvenli Tarama Oblivious HTTP Gateway API, IETF RFC protokolü üzerine kurulmuş, Oblivious HTTP, RFC 9458, gizliliği koruyan bir API'dir.

Genel bakış

Güvenli Tarama Oblivious HTTP Gateway API'si; istemci uygulamaların, ek gizlilik korumaları sayesinde URL'leri Google'ın sürekli güncellenen güvenli olmayan web kaynakları listelerine göre kontrol etmesini sağlayan bir Google hizmetidir.

Bu, Oblivious HTTP veya kısaca OHTTP adlı basit bir protokol aracılığıyla gerçekleştirilir. Bu, kullanıcıların gizliliğinden ödün vermeden sağlam korumalar ve daha fazla kapsam elde etmek amacıyla Google Güvenli Tarama V5 API'lerine erişmek için Güvenli Tarama istemcileri tarafından kullanılabilecek durum bilgisiz bir protokoldür.

NOT: Google Güvenli Tarama V4 API'lerine bu hizmet üzerinden erişilemez.

Güvenli Tarama Habersiz HTTP protokolü

RFC Protokolü

Bilgisiz HTTP, RFC 9458'de tanımlanan, bir istemciden hedef sunucuya HTTP iletilerinin şifrelenmesi ve gönderilmesi için kullanılan basit bir protokoldür. Bu hizmette, istemci tanımlaması için hedef sunucunun IP adresi ve bağlantı bilgileri gibi meta verileri kullanımını azaltacak şekilde güvenilir bir geçiş hizmeti kullanılır. Böylece, düz HTTP/S protokolüne ek olarak gizlilik ve güvenlik sağlanır. Protokol, HTTP isteklerini/yanıtlarını kodlamak/şifrelerini çözmek için RFC 9292'de tanımlanan İkili HTTP kullanır.

Yüksek düzeyde bir geçiş, IP adresleri gibi gizlilik açısından hassas özellikler de dahil olmak üzere tüm istemci tanımlayıcılarını kaldırarak ve Ağ Geçidi hizmetine gelen HTTP isteklerini etkili bir şekilde anonimleştirerek istemci trafiği için proxy yapan İstemci ve Ağ Geçidi kaynağı arasında yer alır. OHTTP'nin ek avantajı, tüm isteklerin uçtan uca şifrelenmesidir.Bu, istemcilerin Güvenli Tarama sorgularının (ör. URL ifadelerinin kısaltılmış karmaları) Geçiş tarafından görülemediği anlamına gelir. Chrome'daki örnek bir uygulama için blog yayınını inceleyin.

Hizmetin genel mimarisi.
Şekil: OHTTP akışı.

Müşteriler herhangi bir Relay sağlayıcısı seçebilir (ör. Hızlıca) entegre edebilirsiniz. Geçiş, hizmete erişmek için aşağıdaki yetkilendirme kapsamıyla birlikte Oauth 2.0 kimlik doğrulamasını kullanmalıdır.


// OAuth Authorization scope: https://www.googleapis.com/auth/3p-relay-safe-browsing
API Uç Noktaları
OHTTP Ortak Anahtarı

Bu uç nokta, RFC 9458'de belirtildiği gibi OHTTP ortak anahtar yapılandırması sağlar. Bu yapılandırma, OHTTP isteğini şifrelemek için istemci tarafından kullanılır.


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

Yukarıdaki API anahtarı kesinlikle gerekli değildir. Sunucu, sağlanan API anahtarına göre OHTTP Ortak Anahtarını değiştirmez. Müşterilerin bu uç noktaya erişmek için farklı geçerli API anahtarları kullanarak veya hiç API anahtarı kullanmadan ve yanıtın gerçekten aynı OHTTP ortak anahtarını içerip içermediğini kontrol ederek bu durumu araştırmalarına izin verilir. Ancak hata ayıklamada kolaylık olması için bir API anahtarı önerilir. Bu, istemcilerin Google Cloud Console'daki istek sayısı gibi istatistikleri görüntülemesine olanak tanır. İstemci bir API anahtarı sağlamayı planlıyorsa API anahtarlarının nasıl ayarlanacağıyla ilgili bu belgeleri inceleyin.

Gizlilik önerileri bölümünde de belirtildiği gibi, temel tutarlılık hedeflerini karşılamak için istemci tedarikçi firmaların, anahtarı bu uç noktadan alıp istemci uygulamalarına dağıtmak için merkezi anahtar dağıtımı altyapısı oluşturmaları önerilir.

Anahtar yönetimi kılavuzuna göre, anahtarlar sunucuda düzenli olarak rotasyona tabi tutulur. Şifre çözme hatalarını önlemek için istemcilerin anahtarı yenilemesi, yani anahtarın yerel kopyasını sık sık yenilemesi ve güncellemesi gerekir.

İstemciler, ortak anahtarı günde bir kez yenilemelidir (getirmeli ve güncellemelidir). Merkezi bir dağıtım mekanizması kullanılıyorsa bu mekanizma, anahtarların günde bir kez getirilmesini ve dağıtılmasını sağlamalıdır.

OHTTP Kapsüllü İsteği

Bu uç nokta, istek şifresinin çözülmesini gerçekleştirerek POST isteğinin HTTP gövdesinde yer alan OHTTP isteğini yerine getirir ve ardından HTTP yanıtında tekrar Relay'e yönlendirilecek OHTTP yanıtını şifreler. İstemci, Content-Type istek başlığını HTTP POST isteğinde message/ohttp-req olarak içermelidir.


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

NOT: RFC ile ilgili talimatlara göre İkili HTTP protokolü RFC 9292'yi kullanarak iç isteği kodlayın (Güvenli Tarama isteğinin nasıl oluşturulacağıyla ilgili V5 dokümanlarına bakın).

İstemci Kitaplıkları

Google Quiche'in hem OHTTP hem de BHTTP protokolleri için istemci tarafı uygulamaları vardır. İstemcilerin bu kitaplıkları kullanması önerilir. API'ye erişmek için OHTTP istekleri oluşturmaya nasıl başlayabileceğinizi öğrenmek üzere aşağıdaki yapay koda bakın.

Örnek istemci tarafı uygulama

İstemciler, Oblivious HTTP ortak anahtarını ortak anahtar uç noktasından getirir. Ardından, quiche OHTTP anahtar yapılandırmasını aşağıdaki gibi başlatın ve quiche OHTTP istemcisini başlatın.


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

İstemci, şifrelemeden önceki ilk adım olarak BHTTP İsteği oluşturmak için İkili HTTP kodlamasını kullanacaktır.


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

Ardından istemci, yukarıdaki adımda oluşturulan İkili Program HTTP isteğini şifreler.


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'den yanıt alındıktan sonra istemci yanıtın şifresini çözer. Yanıtta Content-Type yanıt başlığı ohttp-res şeklinde olacaktır.


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

OHTTP yanıtının şifresini başarıyla çözdükten sonra benzer şekilde İkili HTTP kullanarak çıkışın kodunu çözün.


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