O cliente ( C ) passa por um proxy ( P ) para entrar em contato com um servidor ( S ):
A --http--> P --https--> S
Eu preciso do proxy para poder investigar o conteúdo da solicitação, pois vejo duas opções:
CONNECT
para criar um túnel SSL entre C e S , mas o proxy intercepta e interrompe o túnel SSL gerando um certificado em tempo real assinado por uma autoridade de certificação interna confiável C para cumprir o aperto de mão. https://
: C não cria um encapsulamento, ele simplesmente passa a URL HTTPS para o proxy (como seria fazer com URLs HTTP), o proxy cuida de recuperar os dados de S usando HTTPS e encaminhá-lo para C em HTTP claro. Eu considero que a comunicação entre C e P esteja segura, então não vejo sentido em configurar a interceptação SSL: consome tempo para configurar, precisa injetar uma homebrew CA na CA raiz do cliente, desperdício de recursos de computação para lidar com handshakes inúteis e criptografia. Ao contrário, a segunda opção é o peso leve e permite banir completamente o uso de CONNECT
no proxy.
Um teste manual usando telnet
mostra facilmente que minha instalação do squid funciona bem e suporta corretamente esta segunda opção: Posso recuperar com êxito um documento passando um esquema https://
para o proxy.
No entanto, o cliente C estando no FreeBSD, eu não encontro uma maneira de dizer a qualquer software cliente para agir da mesma maneira.
Não encontrei nenhuma opção relevante em fetch
. Mesma coisa com wget
.
Eu também tentei curl
, parece explicar que todas as operações são feitas através de HTTP, a menos que -p / --proxytunnel é usado, no entanto, ele ainda tenta criar um túnel para conexão HTTPS, mesmo sem essa opção. Eu também tentei jogar com essa opção, incluindo tentar um --no-proxytunnel
, pois de acordo com a mesma manpage, algumas opções booleanas aceitam esta sintaxe, mas sem sorte. Proxy túnel parece de fato ser aplicado na linha 5635 de lib / url.c ( commit ):
/*************************************************************
* If the protocol is using SSL and HTTP proxy is used, we set
* the tunnel_proxy bit.
*************************************************************/
if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy)
conn->bits.tunnel_proxy = TRUE;
Qualquer solução, seja usando ferramentas do sistema básico do FreeBSD ou algum cliente bem conhecido disponível no repositório seria bem-vinda!