# HTTPS com Let's Encrypt (WAMP · Apache · domínio flnghahnomada.myddns.me)

Como emitir e renovar o certificado SSL grátis do Let's Encrypt para o Nexus servido pelo
Apache do WAMP, e deixar o site acessível **pela internet** com cadeado (HTTPS).

> **Contexto:** você apontou o domínio **flnghahnomada.myddns.me** para o servidor
> (172.16.0.148) e abriu as portas **80** e **443** no roteador. Falta o certificado.

---

## ⚠ Antes de tudo — o que significa expor este sistema à internet

O Nexus **abre fechaduras** (InControl), controla automação, mostra câmeras e tem links
públicos por token. Abrir isso para a internet inteira é **maior risco** que um site comum:
qualquer pessoa no mundo passa a alcançar a tela de login e os endpoints.

Você tem duas formas de acesso remoto — escolha consciente:

- **(A) Exposição pública** (o que você começou): domínio + portas 80/443 abertas. Simples,
  funciona de qualquer lugar, **mas** fica exposto. Se for por aqui, siga este guia **e** a
  seção **"Endurecimento"** no fim (senha forte, e de preferência Cloudflare/allowlist na frente).
- **(B) VPN (mais seguro, recomendado se o acesso é só seu/da família):** em vez de abrir
  portas, instale um **Tailscale** ou **WireGuard** no servidor. Você acessa o Nexus de fora
  como se estivesse na rede local, **sem** expor nada à internet. Aí mantém o `Require ip`
  (rede local + faixa da VPN) e **nem precisa** de Let's Encrypt público.

O resto deste guia cobre a opção **(A)**. Se preferir a **(B)**, me avise que monto.

---

## Passo 1 — `Require`: rede local × internet

Sua dúvida está certa. No vhost:

- `Require ip 172.16.0` → libera **todos** os aparelhos da rede local `172.16.0.x`. (Se sua
  LAN for maior, use `Require ip 172.16.0.0/16`.) **Não** libera a internet.
- `Require all granted` → libera **qualquer um** (é o que o acesso pelo domínio público exige).

Para o domínio público funcionar, o `<Directory>` do vhost **precisa** de `Require all granted`
(os vhosts abaixo já vêm assim). Se você fosse ficar só na rede local, aí sim `Require ip`.

---

## Passo 2 — Escolher o cliente ACME (o programa que fala com o Let's Encrypt)

> **Por que não o Certbot?** A EFF **descontinuou o Certbot no Windows** (último instalador em
> fev/2024). E o **win-acme** virou "deprecated" — o autor migrou para o **simple-acme**.

Duas boas opções no Windows (as duas grátis para este uso):

- **simple-acme** (linha de comando, sucessor do win-acme) — `https://simple-acme.com`.
  Rápido, cria a tarefa de renovação sozinho. **Usado neste guia.**
- **Certify The Web** (interface gráfica) — `https://certifytheweb.com`. Mais fácil se você
  prefere clicar; também renova sozinho. Bom plano B.

> **Detalhe importante do WAMP:** o Apache **já ocupa a porta 80**. Então **NÃO** use o modo
> em que o cliente sobe o próprio servidor na 80 (dá conflito). Use **validação por webroot**
> (o cliente grava o arquivo de desafio na pasta pública e o Apache serve). O `.htaccess` do
> Nexus já deixa arquivos reais passarem, então isso funciona sem mexer em nada.

---

## Passo 3 — Emitir o certificado (simple-acme, webroot)

> **⚠ A ORDEM IMPORTA — leia antes de rodar.** O Let's Encrypt valida acessando
> `http://flnghahnomada.myddns.me/.well-known/acme-challenge/...`. Para isso funcionar, **antes**
> de emitir o certificado:
> 1. Os arquivos do Nexus já têm que estar em `C:\wamp64\www\Nexus` (a pasta
>    `...\public` **precisa existir** — senão dá `Directory ... does not exist`).
> 2. O **vhost HTTP (porta 80)** do Passo 4 já tem que estar no ar, com `DocumentRoot`
>    nessa pasta `public` e **`Require all granted`** (o site padrão do WAMP vem
>    `Require local` e devolve **403** para o Let's Encrypt). **Ainda NÃO** crie o vhost
>    443 nem o redirect 80→443 agora — isso é o Passo 4/5, **depois** que o `.pem` existir
>    (o Apache não sobe apontando para um certificado que ainda não foi criado).
>
> **Teste de fumaça (evita gastar as 5 tentativas/hora do Let's Encrypt):** crie
> `mkdir "C:\wamp64\www\Nexus\public\.well-known\acme-challenge"` e
> `echo hello> "...\acme-challenge\test.txt"`, e abra **pelo 4G do celular** (fora do
> Wi-Fi) `http://flnghahnomada.myddns.me/.well-known/acme-challenge/test.txt`. Só siga
> quando aparecer **hello**. (403 = falta `Require all granted`; timeout = porta 80/DDNS.)

1. Baixe o **simple-acme** em `https://simple-acme.com`, extraia em `C:\simple-acme`.
2. Crie a pasta onde os certificados vão morar: no Prompt (Admin) → `mkdir C:\wamp64\certs`.
3. No Prompt **como Administrador**, dentro de `C:\simple-acme`, rode (uma linha só):

```cmd
wacs.exe --source manual --host flnghahnomada.myddns.me --validation filesystem --webroot "C:\wamp64\www\Nexus\public" --store pemfiles --pemfilespath "C:\wamp64\certs"
```

O que isso faz: valida o domínio pondo um arquivo em
`...\Nexus\public\.well-known\acme-challenge\`, baixa o certificado e grava os `.pem` em
`C:\wamp64\certs`, **e cria uma tarefa agendada de renovação automática**.

Vão aparecer (entre outros) estes arquivos em `C:\wamp64\certs`:

- `flnghahnomada.myddns.me-chain.pem` → **certificado + intermediários** (o que o Apache usa)
- `flnghahnomada.myddns.me-key.pem` → **chave privada** (secreta — não compartilhe)

✅ **Deu certo se:** apareceu "Certificate created/stored" e os `.pem` estão em `C:\wamp64\certs`.

> Se preferir o **Certify The Web** (GUI): New Certificate → domínio
> `flnghahnomada.myddns.me` → em *Authorization* escolha **HTTP** com **Website Root (webroot)**
> apontando para `C:\wamp64\www\Nexus\public` → em *Deployment* exporte como **PEM** para
> `C:\wamp64\certs` → e adicione uma *Deployment Task* de "Run Script" para reiniciar o Apache
> (Passo 6). A renovação automática já vem ligada.

---

## Passo 4 — Ligar o SSL no Apache (porta 443)

> **⚠ NÃO habilite o `Include conf/extra/httpd-ssl.conf`** — deixe essa linha do `httpd.conf`
> **comentada**. O `httpd-ssl.conf` que vem com o WAMP tem um vhost de EXEMPLO apontando para
> um `conf/server.crt` que **não existe**, e isso derruba o Apache inteiro com
> *"SSLCertificateFile ... does not exist"*. Fazemos todo o SSL aqui no `httpd-vhosts.conf`,
> que é mais limpo.

No `httpd.conf` (`C:\wamp64\bin\apache\apache2.4.XX\conf\httpd.conf`) só garanta que o módulo
SSL está carregado (já está, no seu servidor) — **não** precisa incluir o `httpd-ssl.conf`:

```apache
LoadModule ssl_module modules/mod_ssl.so
```

No `conf\extra\httpd-vhosts.conf`, adicione o **vhost HTTPS**. O `Listen 443` é global — vai
**fora** do `<VirtualHost>`, no topo do arquivo (ou junto do `Listen 80` no `httpd.conf`):

```apache
Listen 443

<VirtualHost *:443>
    ServerName flnghahnomada.myddns.me
    DocumentRoot "C:/wamp64/www/Nexus/public"

    SSLEngine on
    SSLCertificateFile    "C:/wamp64/certs/flnghahnomada.myddns.me-chain.pem"
    SSLCertificateKeyFile "C:/wamp64/certs/flnghahnomada.myddns.me-key.pem"

    <Directory "C:/wamp64/www/Nexus/public">
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

> `-chain.pem` já traz o certificado + os intermediários (Apache 2.4.8+ aceita tudo num
> arquivo só), por isso não precisa de `SSLCertificateChainFile`.

---

## Passo 5 — Redirecionar HTTP → HTTPS (sem quebrar a renovação)

Troque o vhost da **porta 80** (o que você criou no guia da rede) por este, que manda tudo
para o HTTPS **mas deixa o desafio do Let's Encrypt passar** (senão a renovação futura falha):

```apache
<VirtualHost *:80>
    ServerName flnghahnomada.myddns.me
    DocumentRoot "C:/wamp64/www/Nexus/public"

    # Deixa a validação/renovação do Let's Encrypt passar por HTTP
    <Directory "C:/wamp64/www/Nexus/public/.well-known/acme-challenge/">
        Require all granted
    </Directory>

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
```

Reinicie o Apache (ícone WAMP → **Restart All Services**).

✅ **Deu certo se:** `https://flnghahnomada.myddns.me` abre o Nexus **com cadeado**, e
`http://...` (sem s) redireciona sozinho para o `https://...`.

---

## Passo 6 — Renovação automática + recarregar o Apache

O certificado do Let's Encrypt **vale 90 dias**. O simple-acme/Certify já criaram a **tarefa
agendada** que renova por volta dos 60 dias — mas, ao renovar, o **Apache precisa recarregar**
para pegar o certificado novo. Configure isso uma vez:

- **simple-acme:** rode `wacs.exe` → menu **(A) Manage renewals** → selecione a renovação →
  adicione um **script step** que executa, ao renovar:

  ```cmd
  C:\wamp64\bin\apache\apache2.4.XX\bin\httpd.exe -k restart
  ```

  (ou `net stop wampapache64 && net start wampapache64`).
- **Certify The Web:** *Deployment Tasks* → **Run Script / Restart Service** → reiniciar o
  serviço `wampapache64`.

✅ **Deu certo se:** ao rodar a renovação manualmente (simple-acme → "renew --force"), o
certificado é reemitido e o site volta com o cadeado válido, sem você reiniciar na mão.

---

## Verificação final

1. `https://flnghahnomada.myddns.me` abre com **cadeado** (certificado válido, emitido por
   "Let's Encrypt / R3").
2. `http://flnghahnomada.myddns.me` redireciona para `https://`.
3. Numa ferramenta como `https://www.ssllabs.com/ssltest/` o domínio tira nota **A**
   (opcional, mas bom conferir).

---

## Deu problema?

- **A emissão falha em "acme-challenge / connection refused / timeout"** → o Let's Encrypt não
  alcançou `http://flnghahnomada.myddns.me/.well-known/...`. Confira: porta **80** aberta no
  roteador **e** apontando para 172.16.0.148; o DDNS atualizado com o IP público certo; e teste
  você mesmo, de fora da rede (4G do celular), abrir `http://flnghahnomada.myddns.me`.
  **Alguns provedores bloqueiam a porta 80 de entrada** — se for o caso, use validação **DNS-01**
  (o cliente cria um registro TXT) em vez de HTTP-01.
- **"cadeado" não aparece / erro de certificado** → caminho errado dos `.pem` no vhost 443, ou
  esqueceu de reiniciar o Apache. Confira `C:\wamp64\logs\apache_error.log`.
- **Site abre em HTTP mas não em HTTPS** → falta `Listen 443` no `httpd.conf`, ou o `mod_ssl`
  não está ligado, ou a 443 não está liberada no Firewall do Windows/roteador.
- **Renovou mas o navegador mostra o certificado velho** → faltou o passo de **reiniciar o
  Apache** após a renovação (Passo 6).

---

## Endurecimento (se ficar exposto à internet) — leia

Expondo publicamente, faça pelo menos isto:

1. **Senhas fortes e únicas** para todos os usuários (o Nexus tem login, CSRF e permissões, mas
   senha fraca derruba tudo). Considere trocar/rotacionar qualquer senha que já tenha circulado.
2. **`display_errors = Off`** no `php.ini` (não vazar caminhos/erros para estranhos).
3. **Coloque algo na frente** — o ideal é um **Cloudflare** (proxy grátis: esconde seu IP, dá
   WAF e filtro de bots) ou uma **VPN** (Tailscale/WireGuard) só para você. Com Cloudflare, o
   Let's Encrypt daqui vira opcional (o Cloudflare já entrega HTTPS na borda).
4. **Restrinja o que dá para restringir** — se só você acessa de fora, um `Require ip` com o
   seu IP público (ou a faixa da VPN) no vhost 443 é muito mais seguro que `Require all granted`.
5. **Mantenha o servidor atualizado** (Windows Update, versão do WAMP/Apache/PHP).
6. Lembre que os **links públicos por token** (`/k`, `/convite`, `/atualizar`, `/pat`) agora são
   alcançáveis de fora — é o comportamento esperado deles, mas tenha ciência.

> Recomendação honesta: para um sistema que **abre portas físicas**, o par mais seguro é
> **VPN (Tailscale) + sem portas abertas**, ou **Cloudflare Tunnel** (também dispensa abrir
> portas no roteador). A exposição direta com Let's Encrypt funciona, mas exige a disciplina
> dos itens acima.
