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!
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:
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:
- Criar regras de roteamento avançado com arquivos PAC
- Recursos de failover e fallback para os servidores proxy
- Autoconfiguração do navegador via Web Proxy Auto-Discovery Protocol (WPAD)
- Configuração de um proxy com acesso Web-VPN para sua intranet, ou rede doméstica
- Configuração de um proxy para navegação segura (ex. wi-fi público)
- Criação de uma extensão de proxy personalizada ou subir o patamar de uma extensão existente
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/