Pular para o conteúdo

O certificado

Você não precisa disto para usar o telefone. Pronto para uso, sem nada configurado, um jogador escaneia o QR Code em Ajustes › Dispositivos vinculados e o celular real dele se torna o telefone do personagem: mensagens, e-mail, contatos, Identidade da Cidade, garagem, propriedades, mural de avisos, lugares salvos. Tudo isso funciona em HTTP simples na porta que o seu servidor já mantém aberta.

O que um certificado adiciona é a parte que um navegador se recusa a entregar a uma página insegura:

HTTP simplesHTTPS
Mensagens, e-mail, garagem e todo o restosimsim
Notificações com a página fechadanãosim
O microfone, para gravar mensagens de voznãosim
Instalar como aplicativo no Android, com ícone próprionãosim
Aviso de “Não seguro” na barra de endereçosexibidonão exibido
O token de sessãotrafega em texto abertocriptografado

Essa última linha não é apenas estética. Em HTTP simples, alguém na mesma rede Wi-Fi que o seu jogador pode capturar a sessão dele e ler o telefone. Para uma cidade de roleplay, essa pode ser uma troca aceitável; mas deve ser pelo menos uma decisão consciente, e não uma surpresa.

Você tem um domínio para apontar para o servidor — deixe o telefone obter o próprio certificado

Seção intitulada “Você tem um domínio para apontar para o servidor — deixe o telefone obter o próprio certificado”

Este é o caminho mais curto e não precisa de nenhum outro programa na máquina. O próprio recurso pede um certificado ao Let’s Encrypt, responde ao desafio sozinho, serve TLS diretamente e renova o certificado enquanto estiver em execução.

-- shared/server_config.lua (server-only: this file is never sent to a client)
ServerConfig.Web = {
Url = 'https://phone.yourserver.com/',
Https = {
Enabled = true,
Names = { 'phone.yourserver.com' },
Contact = '[email protected]',
},
}

Depois, uma única vez:

  1. Aponte esse nome para o servidor. Em uma VPS, isso é um registro A. Não tem um domínio próprio? O duckdns.org fornece um gratuitamente em um minuto e ele nunca muda.
  2. Libere as portas 443 e 80 no firewall. A porta 80 só é aberta enquanto um certificado está sendo solicitado e volta a ser fechada assim que a resposta é dada — o log avisa em ambos os momentos.

phonehttps mostra a situação atual do certificado. phonehttps check pergunta ao servidor de testes do Let’s Encrypt se ele consegue conversar com esta máquina, que é a primeira pergunta que vale a pena responder quando nada chega: isso separa o seu firewall deste recurso.

A renovação cuida de si mesma quando ainda resta um terço da validade do certificado, sendo verificada a cada seis horas.

Um provedor de internet entrega um endereço novo para uma conexão residencial sempre que bem entende e, no momento em que faz isso, o nome passa a apontar para o roteador de outra pessoa: os telefones vinculados não conseguem alcançar o servidor e o certificado não consegue renovar. Este recurso já percebe isso — ele verifica o próprio endereço a cada meia hora por causa do QR Code — e, em um domínio DuckDNS, ele também pode corrigir sozinho:

-- shared/server_config.lua
DuckDNS = {
Enabled = true,
Domains = { 'yourname' }, -- the part in front of .duckdns.org
Token = '01d8b39f-...', -- from your duckdns.org page
},

Ele avisa o DuckDNS quando o endereço muda, e uma vez por dia quando não muda — esse sinal diário também é o que coloca as coisas em ordem após um período sem internet, caso a mudança de IP tenha acontecido enquanto nada podia ser enviado. Quando funciona, o log informa e nenhum alarme é disparado; quando falha, o aviso antigo ainda é emitido e enviado junto para o webhook Server.

Em uma VPS o endereço não muda e nada disso é necessário. Deixe Enabled = false.

Não há nada a fazer. Se sv_listingHostOverride estiver definido, o QR Code já é construído como https://seu.dominio/mic_phone/web/ automaticamente, porque esse proxy repassa toda a raiz para o seu servidor. Este é o caso mais fácil e já vem resolvido.

Você já roda um proxy reverso e prefere manter assim

Seção intitulada “Você já roda um proxy reverso e prefere manter assim”

Basta uma linha em shared/config/web.lua:

Url = 'https://phone.yourserver.com/mic_phone/web/',

e um proxy reverso na frente que encerre o TLS e encaminhe para a porta do jogo. Com o Caddy, são duas linhas em um Caddyfile:

phone.yourserver.com {
reverse_proxy 127.0.0.1:30120
}

Com o nginx, encaminhe / para 127.0.0.1:30120 e desative o buffer (proxy_buffering off;), caso contrário o fluxo de eventos (event stream) ficará retido e o telefone deixará de receber atualizações em tempo real.

Uma coisa que não funciona: ativar a nuvem laranja do Cloudflare em um registro DNS que aponta para a porta 30120. O proxy do Cloudflare só aceita uma lista fixa de portas de origem — 80, 8080, 8880, 2052, 2082, 2086, 2095 e 443, 2053, 2083, 2087, 2096, 8443 — e a 30120 não está entre elas. Você precisa de um proxy próprio na frente, como explicado acima.

Você não pode instalar programas extras naquela máquina — mas não precisa: a primeira opção acima não instala nada, é o próprio recurso que faz tudo. O que você precisa pedir à sua hospedagem são duas portas exclusivas para você, 443 e 80, e um domínio apontado para o servidor. Muitas hospedagens fornecem ambas; algumas compartilham essas portas entre todos os clientes da mesma máquina e não fornecem nenhuma. Peça as portas antes de tentar qualquer outra coisa; se a resposta for não, aponte um domínio para um túnel nomeado do Cloudflare.

Você não consegue abrir porta nenhuma — não tem domínio ou o provedor bloqueia

Seção intitulada “Você não consegue abrir porta nenhuma — não tem domínio ou o provedor bloqueia”

Um túnel, então: tools/tunnel.ps1 inicia um túnel rápido (quick tunnel) do Cloudflare, grava o endereço recebido na configuração e avisa você para reiniciar o recurso. Nenhuma porta aberta e nenhum certificado para configurar.

Mas saiba o que ele é: um túnel rápido é temporário por natureza. O endereço é aleatório e um novo endereço é gerado toda vez que o túnel reinicia — e como o navegador vincula o aplicativo instalado, o token salvo e a inscrição de notificações push ao endereço de onde vieram, tudo isso precisa ser configurado novamente a cada reinicialização. Ele serve para testar as coisas. Para qualquer uso que precise sobreviver a uma reinicialização, aponte um domínio para um túnel nomeado, que mantém o mesmo endereço — isso requer uma conta no Cloudflare e um domínio cadastrado nela.

O telefone mantém uma conexão longa aberta para ouvir as mensagens à medida que chegam, e abre essa conexão com um POST em vez do habitual GET de um EventSource. Há dois motivos, e vale a pena conhecer ambos se você estiver colocando um proxy na frente:

  • Um token passado na query string (URL) é um token gravado no log de cada proxy entre o telefone e o servidor. No corpo de um POST, não.
  • Um túnel rápido do Cloudflare mantém um event-stream via GET travado até que o servidor feche a conexão, enquanto deixa um POST passar normalmente (cloudflared#1449). Muitos proxies fazem buffer de fluxos GET por padrão.

O servidor também responde a requisições GET nas mesmas rotas, para qualquer ferramenta que só saiba usar EventSource.