Skip to content

feat: TLS 1.3 no broker MQTT e no Traefik → backend (#78) - #89

Merged
hbgit merged 6 commits into
developfrom
feat/issue-78-tls13
Oct 16, 2026
Merged

hbgit merged 6 commits into
developfrom
feat/issue-78-tls13

Conversation

@hbgit

@hbgit hbgit commented Oct 16, 2026

Copy link
Copy Markdown
Owner

Fecha #78.

O que muda

  • Broker MQTT: tls_version tlsv1.3 no mosquitto.conf. O TLS 1.2 é recusado no handshake; o backend e o app do ACS reconectam em 1.3.
  • Backend: novo ApiTlsConfig (lib/src/config/api_tls_config.dart). Com API_TLS_CERT_PATH e API_TLS_KEY_PATH definidas, o apiServer sobe em HTTPS com TLS 1.3 como mínimo (o padrão do dart:io é 1.2). Sem as duas, segue em HTTP, que é o caminho do Render (backend/DEPLOY.md). Com só uma, o boot falha, para um erro de digitação não cair em texto claro.
  • Traefik → backend: o trecho da 8080 interna deixa de ser texto claro. O traefik-init emite uma segunda folha (runtime/backend/, CN sinalacs-serverpod) assinada pela CA de dev do RPC. O Traefik usa o serversTransport backend-tls (serverName + rootCAs, sem insecureSkipVerify) e o label scheme=https. O healthcheck do compose passou a usar https com --cacert.
  • Sem mTLS interno, de propósito: o Serverpod 3.4.13 sobe o socket pelo relic_io, que chama HttpServer.bindSecure sem requestClientCertificate, então o backend não tem como exigir o certificado do Traefik.
  • QA: scripts/qa/tls_invariants.sh ganhou o Grupo F (broker: 1.3 aceita, 1.2 recusa) e o Grupo E (8080 interna: texto claro não responde, 1.3 com a CA responde, 1.2 recusa, nenhum insecureSkipVerify ativo). dev_key_permissions_test.sh confere os modos da folha do backend e que a ca.key não vai para runtime/backend/. O e2e_stack.sh up roda o traefik-init antes do --no-deps; sem isso, um runtime/ anterior a esta PR deixava o backend em laço de restart.
  • Docs: PROGRESS.md, docs/auditoria-prd/2026-10-15-lacunas-prd.md, CLAUDE.md, backend/CLAUDE.md, backend/DEPLOY.md, apps/CLAUDE.md, development.yaml.

Provas

  • tls_invariants.sh 15/15, mtls_invariants.sh 4/4, api_tls_config_test.dart 7/7. O teste unitário sobe um HttpServer.bindSecure real e negocia com openssl s_client.
  • Backend dart test -j 1: 1388 passando na árvore final.
  • No emulador API 36 (emulator-5554): e2e.sh --emulator (paciente e smoke do ACS), acs_full_e2e.sh e admin_alertas_escalonar_e2e.sh. Este último pausa o Traefik por 120 s, e o backend se recuperou sozinho.
  • Mutações: com serverName errado, o Traefik responde 500 (x509: certificate is valid for … not nome-errado). Com um insecureSkipVerify: true ativo, o Grupo E falha. Sem o mínimo 1.3, o teste unitário falha.

O que continua aberto

  • RNF04 segue parcial. Na stack local ainda trafegam em texto claro: backend → Postgres (REQUIRE_SSL false), backend → Gorush (http), as portas internas 8082/8083 e o painel do Traefik (8081).
  • mTLS Traefik ↔ backend, bloqueado pelo Serverpod (requestClientCertificate).
  • Se a CA for regerada com o Traefik rodando, ele pode manter a CA antiga até docker compose restart traefik serverpod. Isso ainda não está documentado.
  • O E4 de tls_invariants.sh aceitaria os labels scheme=https/serverstransport mesmo comentados. A falha ainda apareceria no e2e.
  • A troca de crt/key da folha do backend no init.sh não é atômica.
  • O ApiTlsConfig não remove espaços em volta dos caminhos. O boot ainda falha, só a mensagem de erro fica pior.

@hbgit

hbgit commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

O mTLS Traefik ↔ backend, que esta PR não cobre, é acompanhado na #90.

@hbgit
hbgit merged commit 271367d into develop Oct 16, 2026
10 checks passed
@hbgit
hbgit deleted the feat/issue-78-tls13 branch October 16, 2026 23:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant