Redirect para HTTPS e proxy reverso

Tudo criptografado, Sem desculpas

Antigamente era caro e inconveniente exigir criptografia para servidores HTTP, você teria que no mínimo gastar alguns trocados com uma entidade certificadora. De um tempo para cá isso não é mais verdade, qualquer um pode usar os certificados da letsencrypt.org, é free, fácil de usar e as ferramentas são de código aberto, então não existe mais desculpa para não usar HTTPS nos seus servidores.

Além de poder usar os certificados diretamente várias ferramentas e serviços estão atualmente gerando o certificado do Let’s Encrypt para você, é o caso do Caddy que basta você fornecer um nome de domínio no seu arquivo de configuração e ele vai solicitar o certificado e usar tudo de forma transparente.

Redirecionando para HTTPS

Para redirecionar tudo os navegadores para a porta HTTPS eu escrevi um pequeno serviço em Golang que simplesmente retorna o código 301 Moved Permanently para o navegador do usuário e indico o novo local apenas substituindo o URL Scheme de HTTP para HTTPS, e deixo o resto do trabalho para o navegador.

Veja o código Go

package main

import (
    "log"
    "net/http"
)

func redirectToHTTPS(w http.ResponseWriter, r *http.Request) {
    redirect := "https://" + r.Host + r.RequestURI
    http.Redirect(w, r, redirect, http.StatusMovedPermanently)
    log.Print("redirect to : " + redirect)
}

func main() {
    log.Print("start redirect http->https")
    if err := http.ListenAndServe(":80", http.HandlerFunc(redirectToHTTPS)); err != nil {
        log.Fatalf("ListenAndServe error: %v", err)
    }
}

Como configurar

Você pode baixar a ultima versão no GitHub em https://github.com/crgimenes/redirectToHTTPS

Para usar basta compilar com go build ou preferivelmente go get:

go get github.com/crgimenes/redirectToHTTPS

Claro que para isso você precisa ter colocado o $GOPATH/bin/ no seu $PATH.

Para executar você vai precisar do root ou de algum usuário com permissão para abrir a porta HTTP.

Usando o Caddy

Durante bastante tempo essa foi a forma como eu redirecionava minhas chamadas para HTTPS mas isso não é mais necessário. Com o Caddy como servidor e proxy ao mesmo tempo é que você não precisa fazer nada, se ele conseguir gerar o certificado para você automaticamente ele vai redirecionar as requisições HTTP para HTTPS.

E o Caddy também é escrito em Golang, tornando a instalação tão fácil como de qualquer outro aplicativo bem escrito, ou seja é só compilar o binário para o PATH e executar como você preferir.

Eu também escrevi um post falando sobre como criar um servidor HTTPS com Golang que não é mais necessário porque é muito mais simples usar o Caddy e criar um servidor simples, subir em uma porta alta.

Subir o servidor em uma porta alta permite que meu usuário carregue ele e não preciso me preocupar com permissões o que ajuda muito na hora de testar o sistema. Claro que se eu pretendo deixar um sistema rodando por mais tempo eu faço isso via um usuário especifico para a tarefa e não com o meu usuário. Outra coisa importante é que o firewall das minhas maquinas não permite nenhum trafego que não seja nas portas SSH, HTTP e HTTPS então ninguém vai conseguir acessar diretamente nenhum serviço.

Configurando

A configuração do Caddy é bem simples. Crie um arquivo com nome Caddyfile no diretório que vai rodar o executável do Caddy.

Aqui esta um exemplo de arquivo de configuração:

example.com {
    gzip
    proxy /api localhost:8000 {
        websocket
        transparent
    }
    proxy /code localhost:8080 {
        websocket
        transparent
        without /code
    }
   root ./root
    # basicauth / user password
}

Nesse arquivo estamos configurando o domínio example.com e dizendo para o Caddy compactar a saída do protocolo usando gzip, em seguida estamos configurando dois redirecionamentos para o nosso proxy interno, um vai redirecionar o trafego que chegar em /api vai manter a string /api quando chamar o servidor rodando na maquina local na porta 8000, essa é a forma como eu prefiro fazer hoje em dia. Já o segundo exemplo vai redirecionar o trafego para a maquina legal na porta 8080 mas vai omitir o /code quando repassar a requisição.

Em seguida estamos avisando o Caddy que o root do nosso site é em ./root que no meu caso é muito útil para servir algumas poucas páginas estáticas e até um arquivo ou outro.

Daí temos uma linha iniciando com # indicando que essa linha esta comentada e será ignorada. Entretanto se desconectar a linha vamos ter basicauth fornecido pelo Caddy, outro recurso muito interessante para que nem tudo fique exposto. Da para usar métodos muito mais sofisticados de autenticação de usuários mas para muita coisa o basicauth é suficiente.

Conclusão

Não existem mais desculpas para não criptografar o trafego para seu servidor, é fácil reforçar para que todos os acessos vão ser via HTTPS e também do nosso lado existem ferramentas para facilitar e muito a tarefa de subir e manter um servidor seguro.

Cesar Gimenes