Simulador
O Simulador é uma cópia reduzida do HubSaúde que roda na sua máquina. Ele responde como o ambiente real, inclusive nas exigências de segurança, o que permite testar autenticação e envio de ponta a ponta sem depender de credenciais de produção. Quem instala e controla é o HubSaúde CLI.
Os dados não sobrevivem ao reinício. O Simulador guarda tudo apenas em memória, então parar e subir de novo devolve o ambiente limpo, inclusive os sistemas cadastrados. Ele escuta em HTTPS na porta 8443.
Ciclo de vida
hubsaude sim start
hubsaude sim status
hubsaude sim logs -f
hubsaude sim stop
Com o Simulador em execução, a página https://localhost:8443 apresenta um resumo do ambiente. A porta pode ser alterada com a variável HUBSAUDE_SIMULADOR_PORT. Veja as variáveis de ambiente.
Preparar seu sistema para o Simulador
Assim como na produção, o Simulador só emite autorização para sistemas previamente cadastrados. A diferença é que o cadastro é feito por você mesmo, em poucos minutos, com um certificado de teste. Não use o certificado ICP-Brasil da instituição nem sua chave privada no Simulador.
1. Gerar um certificado de teste
Crie um par de chave e certificado próprio para os testes. Escolha a ferramenta disponível no seu computador:
- OpenSSL
- Java keytool
openssl req -x509 -newkey rsa:2048 -keyout client-key.pem \
-out client-cert.pem -days 365 -nodes \
-subj "/CN=meu-sistema/O=MinhaInstituicao/C=BR"
keytool -genkeypair -alias meu-sistema -keyalg RSA -keysize 2048 -validity 365 \
-dname "CN=meu-sistema, O=MinhaInstituicao, C=BR" \
-keystore client-keystore.p12 -storetype PKCS12 -storepass changeit
keytool -exportcert -alias meu-sistema -keystore client-keystore.p12 \
-storepass changeit -rfc -file client-cert.pem
O arquivo client-cert.pem é a parte pública, usada no cadastro. A chave fica em client-key.pem (OpenSSL) ou dentro de client-keystore.p12 (keytool).
2. Cadastrar o sistema
Informe um identificador para o sistema, o certificado de teste e as permissões desejadas. O identificador faz o papel do client_id que, na produção, é entregue pelo credenciamento.
curl -k -X POST https://localhost:8443/clients/register \
-F "client_id=meu-sistema" \
-F "certificate=@client-cert.pem" \
-F "allowed_scopes=system/Patient.rs system/Observation.rs"
A opção -k aceita o certificado próprio do Simulador, que não é emitido por uma autoridade reconhecida. No Windows, use curl.exe no lugar de curl para evitar o atalho do PowerShell com o mesmo nome.
3. Confiar no certificado do Simulador
Bibliotecas e aplicações recusam conexões com servidores cujo certificado não reconhecem. Baixe o certificado do Simulador e informe-o ao seu sistema:
curl -k https://localhost:8443/certs/simulador-server.pem -o simulador-server.pem
4. Apontar o SDK para o Simulador
Nos SDKs oficiais, informe o endereço do Simulador como base FHIR e o certificado baixado como âncora de confiança. A descoberta dos demais endereços é automática.
| Linguagem | Endereço do Simulador | Certificado do Simulador |
|---|---|---|
| Python | .fhir_base("https://localhost:8443") | .server_trust_anchor("simulador-server.pem") |
| Java | .fhirBase("https://localhost:8443") | .serverTrustAnchor(Path.of("simulador-server.pem")) |
| TypeScript | fhirBase: "https://localhost:8443" | serverTrustAnchor: "simulador-server.pem" |
| C# | .FhirBase("https://localhost:8443") | .ServerTrustAnchor("simulador-server.pem") |
Use também o client_id cadastrado, a chave e o certificado de teste gerados no primeiro passo. O exemplo completo, com a passagem para a produção e os problemas mais comuns, está na seção Testar com o Simulador de cada SDK: Python, Java, TypeScript e C#. A âncora de confiança serve apenas para testes locais: em produção, o certificado do HubSaúde já é reconhecido automaticamente.
Gerenciar o cadastro
# consultar os dados de um sistema cadastrado
curl -k https://localhost:8443/clients/meu-sistema
# remover o cadastro
curl -k -X DELETE https://localhost:8443/clients/meu-sistema
O que o Simulador reproduz
Não se trata de uma versão simplificada: o Simulador reproduz a mesma mecânica descrita nas páginas de fluxo.
Descoberta
Os mesmos endereços de descoberta que os SDKs consultam para localizar o servidor de autorização: /.well-known/smart-configuration, /metadata e /cds-services.
Emissão de token
Exige certificado de cliente e prende o token emitido a ele, exatamente como a produção faz. Veja Cache e mTLS.
Envio de recursos
Os endereços /fhir/* respondendo no mesmo modelo de envio em duas etapas. Veja como funciona o envio.
Diferenças em relação à produção
| Aspecto | Simulador | Produção |
|---|---|---|
| Cadastro do sistema | Feito por você, pelo endereço /clients/register | Feito pelo credenciamento no Ganesha |
| Certificado do cliente | Qualquer certificado, inclusive de teste | Certificado ICP-Brasil válido da instituição |
| Conferência dos registros | Apenas a estrutura do JSON FHIR | Regras completas dos Guias de Implementação |
| Dados | Em memória, apagados ao reiniciar | Persistidos |
Como o Simulador confere apenas a estrutura, um registro aceito por ele ainda pode ser recusado na produção. Confira sempre os registros no Validador antes de enviá-los.
Na prática
Usar a interface do Simulador
Depois de hubsaude sim start, abra https://localhost:8443 no navegador (aceite o certificado autoassinado na primeira visita). Tudo fica numa única página de referência: o menu superior salta para cada bloco de endpoints e, dentro de cada card, Exemplos traz comandos prontos para copiar.
Use a interface em conjunto com os passos Preparar seu sistema para o Simulador acima. O diagrama do fluxo indica a ordem; os cards detalham cada chamada. Se preferir ir direto pelo SDK, os endereços são os mesmos descritos aqui.
Topo e menu
Confira se o Simulador responde: o indicador em execução (verde) confirma que o processo está no ar. O chip testes / homologação deixa claro que não é produção.
O menu é o mapa da página — clique em Fluxo, Gerar Cert., Clientes e assim por diante, ou role até a seção. Cada item corresponde a uma etapa da integração local.

Fluxo (visão geral)
Comece por aqui para ver a sequência completa antes de executar qualquer comando:
- Gerar certificado de teste
- Registrar o cliente (
POST /clients/register) - Gerar a assertion (
POST /auth/client-assertion) - Obter o token com mTLS (
POST /auth/token) - Chamar FHIR com Bearer token
O banner no topo repete o endereço base (https://localhost:8443) e o link para baixar o certificado do servidor — o mesmo arquivo do passo 3 desta página.

Gerar certificado (passo 1)
Antes de cadastrar o sistema, você precisa de client-cert.pem (público) e client-key.pem (privada). Os comandos da seção Gerar Cert. espelham o passo 1 desta página; abra Exemplos → OpenSSL, copie e adapte o -subj ao nome do seu sistema.
Use o card Verificar o certificado gerado para conferir validade e fingerprint antes do registro. Só o .pem público vai em /clients/register; a chave privada entra depois, no mTLS de /auth/token.

Descoberta (consulta opcional)
Estes três GET são públicos: servem para inspecionar o ambiente ou depurar a descoberta que o SDK já faz sozinho ao apontar para https://localhost:8443.
/.well-known/smart-configuration— endereços de token e capacidades SMART/metadata— CapabilityStatement FHIR R4/cds-services— serviços CDS Hooks disponíveis
Expanda Exemplos → cURL em cada card e execute no terminal (com -k, como nos exemplos desta página).

Certificados do Simulador (JWKS)
Diferente do certificado do seu cliente (passo 1), esta seção trata das chaves do próprio Simulador usadas para assinar access tokens.
GET /certs— JWKS para quem valida tokens manualmentePOST /certs/rotate— só para testes de rotação de chave; invalida tokens já emitidos
Para confiar no HTTPS do servidor no seu código, use o download em /certs/simulador-server.pem, não este JWKS.

Clientes (passo 2)
Aqui você faz o equivalente local ao credenciamento: associa um client_id ao certificado de teste e define os escopos permitidos.
- Abra Clientes no menu.
- No card
POST /clients/register, expanda os exemplos (multipart ou JSON). - Substitua
my-backend-app, o caminho declient-cert.peme os escopos pelos seus valores — como no passo 2 acima. - Use
GET /clients/{clientId}para conferir o cadastro eDELETEpara limpar antes de um novo teste.

Autenticação (passos 3 e 4)
Com o cliente cadastrado, obtenha o access token:
POST /auth/client-assertion— informeclient_ideprivate_key_pem(conteúdo declient-key.pem). A resposta traz o JWT pronto; o Simulador não guarda sua chave privada.POST /auth/token— envie o JWT no formulário OAuth e apresente o mesmo par certificado/chave no TLS (--cert/--keyno cURL). O distintivo mTLS no card lembra que este passo é obrigatório.
Se receber 401 por certificado, confira se o .pem registrado é exatamente o apresentado no handshake. Veja também Autenticação.

FHIR (passo 5)
Com o Bearer token, exercise o envio assíncrono descrito em Enviar e conferir:
POST /fhir/{resourceType}— envie o Bundle comPrefer: respond-asynceIdempotency-Key; anote oContent-Location/ id da Task na resposta202.GET /Task/{id}— faça polling até a Task concluir e leia o resultado emTask.output.- PUT, PATCH e DELETE — mesma ideia assíncrona; os cards listam os headers exigidos.
Copie o exemplo de POST /fhir/Bundle e substitua <ACCESS_TOKEN> e @bundle.json pelos seus.

Administração (encerrar)
Para parar o processo pela API, use POST /shutdown (exemplo cURL no card). No dia a dia, o equivalente pelo CLI é hubsaude sim stop.
