Overview

Güvenli Tarama habersiz HTTP Ağ Geçidi 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, Oblivious HTTP (Oblivious HTTP) ve RFC 9458 adlı IETF RFC protokolü temel alınarak oluşturulmuş, gizliliği korumaya yönelik bir API'dir.

Genel Bakış

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

Bu, Oblivious HTTP (veya kısaca OHTTP) adı verilen hafif bir protokol ile gerçekleştirilir. Bu, Güvenli Tarama istemcilerinin, kullanıcıların güvenliğinden ödün vermeden güçlü korumalar ve daha fazla kapsam elde etmek amacıyla Google Güvenli Tarama V5 API'lerine erişmek için kullanabileceği durum bilgisiz bir protokoldür. gizlilik.

NOT: Google Güvenli Tarama V4 API'lerine bu hizmet aracılığıyla erişilemez.

Güvenli Tarama'dan habersiz HTTP protokolü

RFC Protokolü

habersiz HTTP, RFC 9458'de tanımlanan ve bir istemciden hedef sunucuya HTTP iletilerini şifrelemek ve göndermek için kullanılan basit bir protokoldür. Bu, hedef sunucunun istemci tanımlaması için IP adresi ve bağlantı bilgileri gibi meta veri kullanımını azaltarak güvenilir bir geçiş hizmeti kullanır. Böylece, düz HTTP/S protokolünün yanı sıra gizlilik ve güvenlik sağlar. Protokol, HTTP isteklerini/yanıtlarını kodlamak/kodlarını çözmek için RFC 9292'de tanımlanan İkili HTTP'yi kullanır.

Üst düzeyde bir Geçiş, Ağ Geçidi hizmetine gelen HTTP isteklerini etkili bir şekilde anonimleştirerek tüm istemci tanımlayıcılarını (IP adresleri gibi gizlilik açısından hassas özellikler dahil) kaldırarak istemci trafiğini temsil eden İstemci ve Ağ Geçidi kaynağı arasında kalır. OHTTP'nin ek avantajı, tüm isteklerin uçtan uca şifrelenmesidir. Yani, Güvenli Tarama sorguları (ör. URL ifadelerinin kısaltılmış karmaları) Geçiş tarafından görülemez. Chrome'daki örnek uygulama için blogpost bakın.

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

Müşteriler herhangi bir Geçiş sağlayıcısını (ör. Fastly) de sağlamanız gerekir. Geçişin, hizmete erişmek için aşağıdaki yetkilendirme kapsamıyla Oauth 2.0 kimlik doğrulamasını kullanması gerekir.


// 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, istemci tarafından OHTTP isteğini şifrelemek için 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. İstemcilerin bu uç noktaya erişmek için farklı geçerli API anahtarları kullanarak veya hiç API anahtarı kullanmayarak ve yanıtın aynı OHTTP ortak anahtarını içerip içermediğini kontrol ederek bu durumu kontrol etmesine olanak tanır. Ancak hata ayıklamayı kolaylaştırmak için API anahtarı kullanmanız önerilir; Bu sayede, istemciler, istek sayısı gibi istatistikleri Google Cloud Console'da görüntüleyebilir. İstemci bir API anahtarı sağlamayı planlıyorsa API anahtarlarının nasıl ayarlanacağıyla ilgili bu belgelere bakın.

Gizlilik önerileri bölümünde belirtildiği gibi, temel tutarlılık hedeflerine ulaşmak için istemci tedarikçi firmaların, anahtarı bu uç noktadan getirmek ve ardından 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 dahil edilir. İstemciler, şifre çözme hatalarından kaçınmak için anahtarı yenilemeli, yani anahtarın yerel kopyasını sık sık getirmeli ve güncellemelidir.

İstemciler ortak anahtarı günde bir kez yenilemelidir (getirme ve güncelleme). Merkezi bir dağıtım mekanizması kullanılıyorsa bu mekanizma, anahtarları günde bir kez getirip dağıttığından emin olmalıdır.

OHTTP Kapsüllü İstek

Bu uç nokta, isteğin şifresini çözerek POST isteğinin HTTP gövdesine eklenen OHTTP isteğini sunar ve ardından OHTTP yanıtını, HTTP yanıtında tekrar Geçiş'e iletilecek şekilde şifreler. İstemci, HTTP POST isteğine Content-Type istek başlığını message/ohttp-req olarak eklemelidir.


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

NOT: RFC ile ilgili yönergelere göre, İkili HTTP protokolüyle RFC 9292'yi kullanarak dahili 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'te hem OHTTP hem de BHTTP protokolleri için istemci tarafı uygulamaları bulunur. İstemcilerin bu kitaplıkları kullanması önerilir. API'ye erişmek için OHTTP istekleri oluşturma işlemini nasıl yapacağınızı öğrenmek için sözde kodu aşağıda bulabilirsiniz.

Örnek istemci tarafı uygulaması

İstemciler ortak anahtar uç noktasından habersiz HTTP ortak anahtarını getirir. Ardından, kiş OHTTP anahtarı yapılandırmasını bu şekilde başlatın ve kiş 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 Program 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);

İstemci daha sonra yukarıdaki adımda oluşturulan İkili 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ıt, ohttp-res olarak Content-Type yanıt başlığını içerir.


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