Desenvolvimento

31 jul, 2013

SPDY e suporte para proxy seguro no Google Chrome

Publicidade

Um dos recursos exclusivos do Google Chrome é o suporte nativo para proxies baseados em SSL. Apesar de proxies HTTP poderem fazer um túnel SSL, a conexão inicial com o proxy é feita em texto puro, o que permite ao invasor bisbilhotar o host para o qual você está navegando. Historicamente, para resolver essa limitação, é preciso contar com programas cliente-servidor adicionais para criar um túnel VPN (ex. :OpenVPN), ou rotear nossas conexões via SSH (ex.: túneis SOCKS por SSH com ssh -D).

Com o Chrome, você pode simplesmente inserir a URL de um proxy HTTPS no navegador, e ele tomará conta do resto: um túnel TLS é estabelecido com o proxy, e as requisições de proxy são enviadas por um link seguro. Não há como bisbilhotar!

Proxy SPDY via SSL NPN

O benefício adicional de oferecer suporte para proxies HTTPS é que podemos utilizar o NPN (Next Protocol Negociation) do SSL para fazermos uma upgrade na nossa conexão de forma que ela utilize SPDY! Uma vez que o túnel está estabelecido, o navegador e o proxy podem multiplicar vários fluxos SPDY na mesma conexão, permitindo que possamos minimizar a latência e otimizar o throughput – o que é especialmente útil em dispositivos móveis. De fato, é precisamente dessa forma que o Silk, o navegador da Amazon, funciona: uma única conexão SPDY a um proxy AWS!

spdyproxy-diagrama

Se o seu navegador precisar carregar um elemento HTTP, ele usa a mesma conexão SPDY, mas dentro de seu frame SPDY ele aloca um novo “Stream ID”, que indica para qual proxy há uma requisição independente. O proxy pode carregar o elemento HTTP para você e enviá-lo pelo SPDY. O melhor de tudo é que essa forma de funcionamento serve também para HTTPS, o que significa que podemos criar um túnel SSL sob uma conexão SSL e só então criar um túnel SPDY sob uma conexão SPDY:

spdyproxy-tunnel

Se inspecionarmos o chrome://net-internals#spdy, poderemos ver que no exemplo acima estamos conectados a um proxy SPDY v2 local rodando na porta 44300. Contudo, quando requisitamos https://www.google.com, o navegador negocia uma sessão SPDY v3 com servidores do Google. Estamos fazendo um túnel SSL dentro de outra sessão SSL! O proxy sabe apenas que estamos conectados com o google.com, mas não pode inspecionar quaisquer dos dados criptografados. Talvez apenas alguns metadados, mas isso é um recurso bastante avançado – leia mais sobre túneis HTTPS.

Proxy SPDY do tipo “faça você mesmo” com node.js

Uma forma de ver um proxy SPDY em ação é pegar um dispositivo Kindle Fire. Como alternativa, podemos produzir nosso próprio “proxy Silk” local com apenas algumas linhas de código e configuração:

node-spdyproxy – SPDY forwarding proxy – fast and secure.

[shell]

gt; npm install -g spdyproxy
gt; spdyproxy -k keys/mykey.pem -c keys/mycert.pem -p 44300 -v

[/shell]

Você precisará do node.js 0.8.x ou superior para ter suporte NPN (siga as instruções no readme). Uma vez que o spdyproxy estiver instalado, você pode usar suas chaves SSL e iniciar uma instância local. Agora só precisamos dizer ao Google Chrome quando utilizar nosso proxy. Para isso, podemos criar um arquivo PAC (Proxy Auto-Configuration), que consiste em uma única função JavaScript:

[javascript]

function FindProxyForURL(url, host) {
// Route all HTTP requests to our proxy
if (shExpMatch(url, "http:*"))  return "HTTPS localhost:43000";

// HTTPS requests go directly to the host (Amazon’s Silk setup)
// See: http://www.amazon.com/gp/help/customer/display.html/?nodeId=200775440
if (shExpMatch(url, "https:*")) return "DIRECT";

// Alternatively, we can route *all* traffic through our SPDY
// proxy by simply providing one rule in our PAC file:
return "HTTPS localhost:43300";
}

[/javascript]

Salve o arquivo acima e agora poderemos iniciar o Chrome com o parâmetro –proxy-pac-url:

[shell]

gt; /path/to/Chrome –proxy-pac-url=file:///path/to/config.pac –use-npn

[/shell]

O cenário acima apenas toca a superfície do que podemos fazer:

Tudo isso e muito mais acessível diretamente através do seu navegador, e sem a necessidade de instalar e configurar qualquer software adicional. Na verdade, com um pouco de trabalho extra, podemos até mesmo estender o spdyproxy para realizar otimização de conteúdo para entregar carregamentos de páginas mais rapidamente para dispositivos móveis e tablets, bem no estilo Opera Turbo ou Amazon Silk.

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://www.igvita.com/2012/06/25/spdy-and-secure-proxy-support-in-google-chrome/