DAT CMS

O DAT CMS cria certificados, armazena-os em um banco de dados e entrega os certificados adequados aos serviços emissores e verificadores. O comportamento do protocolo é descrito na especificação do DAT CMS.

Criar uma configuração de execução

Serviço de gerenciamento de certificados DAT

dns

Servidor

PortPadrão: 8088
HostnamePadrão: Auto
terminal

Comando de execução

bash
Verificar API
bash
database

Banco de dados

Cache da APIPadrão: 60
verified_user

Certificado DAT

Algoritmo de assinatura
Algoritmo de criptografia
Atraso de emissão do certificadosegundoshelp
Período de emissão de DATsegundoshelp
TTL do DAT (duração)segundoshelp
Programação de geração de certificados DAT (Cron)help
lock

Controle de acesso

Master token
Gerar certificados DAT e consultar a versão do servidor
Full Cert token
Obter certificados Full (Pair Key, Hash Key)
Verify Cert token
Obter certificados Verify (Verify Key Only)

Executar com Docker

Execute o container como usuário não root. Ao usar SQLite, monte um diretório de dados com permissão de escrita. Forneça tokens e senhas do banco de dados por um mecanismo de injeção de secrets, não pelo histórico de comandos.

docker run --rm --name dat-cms -p 8088:8088 \
  --user 10001:10001 \
  -v "$PWD/dat-cms-data:/data" \
  -e PORT=8088 \
  -e DB_URI='sqlite:/data/data.db' \
  -e TOKEN_MASTER='replace-with-a-secret' \
  -e TOKEN_CERT_FULL='replace-with-a-secret' \
  -e TOKEN_CERT_VERIFY='replace-with-a-secret' \
  sarolab/dat-cms

Banco de dados

Use DB_URI para configurar uma conexão SQLite, PostgreSQL ou MySQL. O MariaDB se conecta pelo protocolo MySQL. O CMS armazena em cache os resultados das consultas de certificados como um snapshot e continua servindo o último snapshot bem-sucedido quando uma atualização do armazenamento falha temporariamente.

DB_CACHE_SECS define o intervalo de atualização do snapshot, enquanto DB_QUERY_TIMEOUT_SECS limita as consultas de atualização. Se não existir um snapshot bem-sucedido e o armazenamento não puder ser lido, o serviço retorna DAT_STORE_UNAVAILABLE.

Papéis de acesso

Variável de ambientePermissãoUsado por
TOKEN_MASTERRegistrar certificados e obter a versão protegidaOperações
TOKEN_CERT_FULLObter certificados completosServiços emissores de DAT
TOKEN_CERT_VERIFYObter certificados exclusivos para verificaçãoServiços de verificação e descriptografia

Cada variável aceita tokens alfanuméricos separados por vírgulas. Se a lista de tokens de um papel estiver vazia, os endpoints desse papel serão abertos e um aviso será registrado.

Geração de certificados

O papel master registra um certificado especificando o algoritmo de assinatura, o algoritmo de criptografia, o atraso de propagação, o período de emissão e o TTL. Durante o atraso de propagação, os serviços sincronizam o novo certificado antes que ele possa emitir.

Integração do cliente

  1. Use o token completo e o endpoint de certificados completos nos serviços emissores.
  2. Use o token de verificação e a opção verify-only nos serviços verificadores.
  3. Confira o resultado da primeira sincronização; se a inicialização tiver de falhar, chame a API de sincronização imediata.
  4. Quando a sincronização automática estiver ativa, feche o gerenciador durante o encerramento da aplicação.

Consulte os guias das bibliotecas para ver o builder e o comportamento de encerramento de cada linguagem.

Verificações operacionais

  • /health e /version/api informam o status sem autenticação.
  • /version exige o master token quando esse papel está configurado.
  • Colete os logs da saída padrão e da saída de erro padrão.
  • Encaminhe os sinais de encerramento e dê tempo para o banco de dados e o scheduler fecharem.

Kubernetes

Ajuste a porta do container e as probes à porta do serviço, e monte o diretório de dados com acesso de escrita para o usuário não root. Injete tokens e detalhes da conexão com o banco de dados por Secrets.

securityContext:
  runAsNonRoot: true
  runAsUser: 10001
  runAsGroup: 10001
containers:
  - name: dat-cms
    image: sarolab/dat-cms
    ports: [{ containerPort: 8088 }]
    readinessProbe: { httpGet: { path: /health, port: 8088 } }
    livenessProbe: { httpGet: { path: /health, port: 8088 } }