Pular para o conteúdo principal

Configuração do Servidor

Todas as chaves que o Servidor lê, o padrão de cada uma, se um Administrador pode alterá-la em tempo de execução e se uma alteração exige reinício. O Workstation Service e o Tray App são configurados à parte: veja Configuração das estações de trabalho.

De onde vem um valor​

Seis fontes, da menor para a maior precedência. Uma fonte posterior prevalece sobre uma anterior, chave por chave:

FonteOnde existe
1appsettings.jsonEmbutido na imagem. Não é um arquivo que a implantação edita.
2appsettings.{ASPNETCORE_ENVIRONMENT}.jsonO appsettings.Development.json está na imagem e fica inerte porque uma implantação não é o ambiente Development. Nunca execute uma implantação como Development: esse arquivo contém a licença de exemplo do PKI SDK e as credenciais de um Signer de teste compartilhado.
3User secretsSomente na máquina de um desenvolvedor.
4Variáveis de ambienteO container: o environment: do Compose ou os application settings do App Service. __ substitui :.
5Linha de comandoNenhum dos dois cenários usa.
6Os overrides que um Administrador salvouUma tabela no banco de dados da plataforma, lida na inicialização e relida sempre que uma configuração é salva na tela Configurações e usuários.

A fonte 6 é silenciosa e prevalece. Se você define uma das sete chaves que aceitam override na implantação e o valor não tem efeito, alguém salvou um valor na tela Configurações e usuários; o seu valor é o padrão para o qual a chave volta quando o override é limpo.

Chave que um Administrador pode sobrescreverPadrão
Sessions:DefaultDuration1 h
Sessions:MaxDuration24 h
Sessions:PinPromptTimeout60 s
Sessions:MaxPinFailures5
Sessions:PinFailureWindow15 min
Signing:WorkstationReconnectGrace15 s
Audit:RetentionDays365

Essas sete entram em vigor sem reinício. Uma linha salva com qualquer outra chave é ignorada, e não aplicada. Trate todas as outras chaves desta página como exigindo reinício.

Como escrever uma chave​

: num arquivo, __ no ambiente:

{ "Sessions": { "MaxDuration": "12:00:00" } }
environment:
Sessions__MaxDuration: "12:00:00"
az webapp config appsettings set -g <rg> -n <app> --settings Sessions__MaxDuration=12:00:00
  • Um único sublinhado não faz nada: Sessions_MaxDuration é uma variável que o Servidor nunca lê.
  • Uma lista é indexada, e o índice faz parte da chave: KeyRingProtector__RetiredCertificates__0__Certificate.
  • Uma duração é [d.]hh:mm:ss, e as horas precisam ficar abaixo de 24. 24:00:00 são vinte e quatro dias; um dia é 1.00:00:00.
  • Um tamanho é uma contagem simples de bytes. Um booleano é true ou false, em minúsculas.
  • Uma categoria de log mantém os pontos: Logging__LogLevel__TrustBridge.Server.Common.Vault.

Banco de dados e chaveiros​

ConnectionStrings:TrustBridge​

Padrão uma string local com autenticação do Windows, só para desenvolvimento · Override pelo Administrador não · Exige reinício sim

O único banco de dados da plataforma: schema, Trilha de Auditoria, os dois chaveiros e os overrides do Administrador. O padrão da imagem não funciona no Linux, então uma implantação que esquecer esta chave tem a inicialização recusada depois de cerca de noventa segundos de tentativas.

# Docker on Linux, SQL Server beside it
ConnectionStrings__TrustBridge: >-
Server=sqlserver,1433;Database=TrustBridge;User Id=sa;
Password=${MSSQL_SA_PASSWORD};Encrypt=True;TrustServerCertificate=True
# Azure App Service, managed identity
ConnectionStrings__TrustBridge="Server=tcp:<sqlserver>.database.windows.net,1433;Database=TrustBridge;Authentication=Active Directory Managed Identity;Encrypt=True"

Database:MigrateOnStart​

Padrão true · Override pelo Administrador não · Exige reinício sim

Se o Servidor aplica as migrações pendentes ao banco de dados na inicialização, antes de atender qualquer coisa. false não significa "iniciar mesmo assim": uma migração pendente, nesse caso, recusa a inicialização, citando as migrações e o comando a executar. Dois estados recusam a inicialização qualquer que seja o valor: um banco de dados com migrações que este build não contém, e um banco de dados que não pode ser acessado em cerca de noventa segundos. Aplicar migrações exige db_ddladmin; um banco de dados atualizado não precisa de nenhum DDL.

Três limites de tempo são constantes, e não chaves: cerca de noventa segundos para o banco de dados começar a responder, cinco minutos para a migração de outro processo terminar e trinta minutos para cada comando de uma migração. No Azure App Service, o WEBSITES_CONTAINER_START_TIME_LIMIT (padrão de 230 s) é atingido primeiro; aumente-o para 1800.

KeyRingProtector:Certificate​

Padrão não definido · Override pelo Administrador não · Exige reinício sim

Obrigatória em toda implantação, inclusive numa que não guarda certificados próprios. Um PKCS#12 codificado em base64, numa única linha e sem cabeçalho PEM, com uma chave privada RSA. Não é um caminho nem um thumbprint. Quatro recusas impedem o host de iniciar: não configurada, não é base64, não pôde ser aberta (senha errada ou não é um PKCS#12) e nenhuma chave privada RSA utilizável. Veja Segurança.

environment:
KeyRingProtector__Certificate: ${KEY_RING_PROTECTOR_CERTIFICATE:?set KEY_RING_PROTECTOR_CERTIFICATE in .env}
# App Service: an app setting, or better, a Key Vault reference
KeyRingProtector__Certificate="@Microsoft.KeyVault(SecretUri=https://<vault>.vault.azure.net/secrets/<name>/)"

KeyRingProtector:CertificatePassword​

Padrão não definido · Override pelo Administrador não · Exige reinício sim

A senha que abre o protetor. Ausente significa que o PKCS#12 não precisa de senha, que é o padrão honesto para um protetor fornecido como configuração.

KeyRingProtector:RetiredCertificates:{n}:Certificate e …:{n}:CertificatePassword​

Padrão vazio · Override pelo Administrador não · Exige reinício sim

Protetores que esta implantação já usou para selar, mantidos para que o material de chave selado com um deles continue legível. Só para decifrar, e mantidos permanentemente: a rotação nunca re-cifra as chaves armazenadas. É uma lista de objetos, porque cada PKCS#12 aposentado tem a própria senha, pareada pelo índice. Não coloque uma entrada vazia em templates: uma entrada cujo Certificate resulta numa string vazia recusa a inicialização.

environment:
KeyRingProtector__Certificate: <the new one>
KeyRingProtector__RetiredCertificates__0__Certificate: <the one it replaced>
KeyRingProtector__RetiredCertificates__0__CertificatePassword: <if that one had a password>

Logs​

Logging:LogLevel:{category}​

Padrão Information, com Microsoft.AspNetCore em Warning · Override pelo Administrador não · Exige reinício sim

Os níveis de log do framework, e o único lugar em que um nível é decidido: o console, o arquivo rotativo e o Application Insights recebem exatamente as linhas que esses níveis deixam passar. Seis categorias trazem as linhas que vale a pena reconhecer, todas em Information ou acima, então o padrão já as mostra:

CategoriaO que informa
TrustBridge.Server.Common.Persistence.SchemaUpgradeQuais migrações foram aplicadas nesta inicialização, ou por que o schema foi recusado
TrustBridge.Server.Common.Persistence.SchemaGateQue os overrides do Administrador não puderam ser relidos depois da etapa do schema
TrustBridge.Server.Common.KeyRings.KeyRingPostureQual protetor está selando agora, com o thumbprint e o número de aposentados
TrustBridge.Server.Common.Vault.VaultReadinessSe o cofre está desligado, aberto ou travado fechado
TrustBridge.Server.Common.Audit.AuditLogUma linha de auditoria que não conseguiu chegar ao banco de dados, em Critical, com a própria linha
TrustBridge.Pki.Validation.LacunaPkiRuntimeQue a licença do PKI SDK está ausente ou vencida

Aumente o nível de uma categoria, não o nível mínimo geral: o log de debug do framework soterra essas seis linhas.

Logging:File:Directory​

Padrão trustbridge-logs no diretório temporário do processo (/tmp/trustbridge-logs) · Override pelo Administrador não · Exige reinício sim

Onde o arquivo rotativo em JSON compacto é gravado, um por dia, com nova rotação ao passar de um gigabyte. A tela Log do Servidor do console administrativo lê esse arquivo. Vazio desliga o arquivo, que é o que um sistema de arquivos somente leitura define. Um diretório que o Servidor não consegue criar deixa o arquivo desligado durante toda a vida do processo, com um Warning; o console não é afetado.

Logging:File:RetainedDays​

Padrão 14 · Override pelo Administrador não · Exige reinício sim

Quantos dias de arquivos são mantidos. Abaixo de 1, a inicialização é recusada. É um limite de uso de disco, e não uma política de retenção: o pipeline do console é o registro.

Logging:ApplicationInsights:ConnectionString​

Padrão não definido · Override pelo Administrador não · Exige reinício sim

Uma connection string do Application Insights. Quando definida, toda linha também é enviada para lá como um trace, com o id de correlação e a categoria como dimensões personalizadas. Quando não definida, APPLICATIONINSIGHTS_CONNECTION_STRING é lida no lugar dela, então um workspace associado pelo portal do App Service não precisa de uma segunda configuração. Um valor que não seja uma connection string recusa a inicialização.

AllowedHosts​

Padrão * · Override pelo Administrador não · Exige reinício sim

O filtro de header Host do framework. Nenhum dos dois cenários precisa dele.

O serviço de assinatura​

Onde fica o Lacuna Signer e como o TrustBridge se autentica nele. As duas coisas ou nenhuma: um Signer não configurado é uma implantação suportada, em que /v1/signatures recusa as chamadas e todo o resto funciona; um endereço sem chave recusa a inicialização.

environment:
Signer__BaseAddress: https://signer.example.com
Signer__ApiKey: My Application|43fc0da834e48b4b840fd6e8c371…
Signer__ApplicationName: My Application # only for a key that is the secret half alone
Signer__FolderId: f81d4fae-7dec-11d0-a765-00a0c91e6bf6
Signer__RequestTimeout: "00:00:10"
ChavePadrãoSignificado
Signer:BaseAddressnão definidoO endereço base do Signer. Defini-lo torna ApiKey obrigatória.
Signer:ApiKeynão definidoA única chave de API do Signer que o TrustBridge guarda em nome de todas as Aplicações Cliente, na forma completa application|secret que o Signer publica.
Signer:ApplicationNamenão definidoA parte da aplicação, só para uma chave que traga apenas o secret. Ignorada quando a chave contém |.
Signer:FolderIdnão definidoA pasta do Signer em que todos os documentos são colocados, como GUID. Não definida, é a raiz da organização.
Signer:RequestTimeout10 sO limite de uma chamada ao Signer. Um valor não positivo recusa a inicialização.

Todas exigem reinício, e nenhuma aceita override.

Sessões de Assinatura​

Cinco das sete chaves que aceitam override do Administrador estão aqui. Sessions:SignatureAllowance não tem padrão e está ausente do exemplo de propósito.

environment:
Sessions__DefaultDuration: "01:00:00"
Sessions__MaxDuration: "1.00:00:00"
Sessions__MaxPinFailures: "5"
Sessions__PinFailureWindow: "00:15:00"
Sessions__PinPromptTimeout: "00:01:00"
Sessions__PinRelayTimeout: "00:00:05"
Sessions__ExpirySweepInterval: "00:05:00"
ChavePadrãoOverrideReinícioSignificado
Sessions:DefaultDuration1 hsimnãoA janela de ociosidade concedida quando o cliente não pede nenhuma. Um valor não positivo recusa a inicialização.
Sessions:MaxDuration24 h (1.00:00:00)simnãoA maior janela que um cliente pode pedir; um pedido maior é reduzido a esse limite, e o valor reduzido é devolvido. Abaixo de DefaultDuration, recusa a inicialização.
Sessions:MaxPinFailures5simnãoComparações de PIN com falha, dentro da janela, que bloqueiam um CPF para criação de sessão, contadas por CPF somando todas as chaves de API. Zero recusa a inicialização.
Sessions:PinFailureWindow15 minsimnãoA janela deslizante do bloqueio e o tempo de espera.
Sessions:PinPromptTimeout60 ssimnãoPor quanto tempo um pedido de PIN no Tray App fica na tela antes de a criação desistir. O Tray:PromptTimeout da própria estação de trabalho (90 s) é mais folgado de propósito, porque um Servidor que já desistiu não consegue tirar o pedido da tela.
Sessions:PinRelayTimeout5 snãosimO prazo de todo o repasse do PIN por todos os certificados candidatos, no caminho com cache.
Sessions:ExpirySweepInterval5 minnãosimA frequência com que a varredura encerra no registro as sessões vencidas. Não muda nenhum veredito. Não é validada na inicialização.

Sessions:SignatureAllowance​

Padrão não definido (sem limite) · Override pelo Administrador não · Exige reinício sim

Quantas chamadas de assinatura uma Sessão de Assinatura pode fazer antes de terminar como Esgotada (Exhausted), o que vier primeiro entre seus dois limites. Uma unidade por chamada, não por documento: um lote de cinquenta gasta uma, e uma chamada cujos documentos falharam todos antes de o certificado assinar não gasta nenhuma. Uma franquia de 1 reproduz a sessão de uso único da implementação de referência. Zero ou menos recusa a inicialização. É concedida na criação, então uma alteração só governa as sessões criadas depois dela. O protocolo não informa o saldo restante; a tela Sessões de Assinatura mostra o quanto foi gasto.

A superfície de assinatura​

environment:
Signing__RequestBudget: "00:01:00"
Signing__HashSignTimeout: "00:00:25"
Signing__SignerCancelBudget: "00:00:03"
Signing__StrandedAfter: "00:10:00"
Signing__StrandedSweepInterval: "00:05:00"
Signing__WorkstationReconnectGrace: "00:00:15"
Signing__ReconnectPollInterval: "00:00:00.250"
Signing__MaxDocumentBytes: "10485760"
Signing__TransportHeadroomBytes: "65536"
Signing__MaxBatchItems: "50"
Signing__SignerConcurrency: "32"
ChavePadrãoOverrideSignificado
Signing:RequestBudget60 snãoToda uma assinatura síncrona, da admissão da requisição até os bytes assinados. Estourar esse prazo responde SIGN_TIMEOUT. HashSignTimeout mais WorkstationReconnectGrace precisam caber nele, ou a inicialização é recusada.
Signing:HashSignTimeout25 snãoQuanto tempo uma assinatura de hash despachada pode levar antes de a máquina ser considerada inacessível. Bem acima dos cerca de 340 ms que um token gasta, porque a máquina pode estar ocupada com o documento de outra pessoa.
Signing:SignerCancelBudget3 snãoQuanto tempo a limpeza pode levar quando uma execução que não assinou nada encerra o documento no Signer.
Signing:StrandedAfter10 minnãoQuanto tempo uma Operação de Assinatura pode ficar em Pending antes de a varredura encerrá-la como Failed, com RUN_STRANDED. Precisa ser maior que RequestBudget mais SignerCancelBudget.
Signing:StrandedSweepInterval5 minnãoA frequência dessa varredura. Uma passagem também roda na inicialização. Não é validada na inicialização.
Signing:WorkstationReconnectGrace15 ssimQuanto tempo uma assinatura espera a estação de trabalho vinculada voltar antes de responder WORKSTATION_OFFLINE. Zero recusa na hora e é válido; um valor negativo recusa a inicialização.
Signing:ReconnectPollInterval250 msnãoA frequência com que essa tolerância verifica de novo a presença. Um valor não positivo recusa a inicialização.
Signing:MaxDocumentBytes10 MB (10485760)nãoO maior documento que o Servidor assina, medido nos bytes decodificados. Acima do limite, responde 413 no envelope do contrato. Limita a memória, não o armazenamento. Os limites de transporte subjacentes são derivados dele.
Signing:TransportHeadroomBytes64 KBnãoFolga, além do documento codificado, para o restante do corpo da requisição.
Signing:MaxBatchItems50nãoQuantos documentos uma chamada em lote pode citar. Uma chamada com mais é recusada antes de qualquer documento ser assinado. Junto com MaxDocumentBytes, define o que um lote em andamento pode ocupar: 500 MB com os padrões.
Signing:SignerConcurrency32nãoQuantas execuções de assinatura podem estar em andamento no Signer ao mesmo tempo, em todo o Servidor. Um lote maior roda em ondas. Zero recusa a inicialização.

Todas exigem reinício, exceto WorkstationReconnectGrace.

O throttling global​

Um limite para quantas chamadas do contrato o Servidor executa ao mesmo tempo, com uma fila curta à frente dele. Uma chamada descartada responde 429 SERVER_BUSY, sem Retry-After. Ele vale somente para a superfície do SignSession Contract; o canal das estações de trabalho, o console administrativo, o probe de saúde, a página inicial, a documentação e a admissão de estações de trabalho ficam fora dele. Os padrões ficam quase sete vezes acima da carga projetada: é um disjuntor (circuit breaker), não um teto de vazão.

ChavePadrãoSignificado
Throttle:ConcurrencyLimit200Quantas chamadas do contrato podem rodar ao mesmo tempo. Zero recusa a inicialização; de propósito, não há como desligá-lo. É Signing:SignerConcurrency, e não este, que molda a vazão de assinaturas.
Throttle:QueueLimit50Quantas chamadas podem esperar por uma vaga antes de a seguinte ser descartada. Zero é válido e significa sem fila; um valor negativo recusa a inicialização.

Admissão de estações de trabalho​

Quais máquinas podem pedir para entrar, quanto da fila um desconhecido pode ocupar e por quanto tempo um pedido abandonado permanece. Uma implantação padrão não define nenhuma destas. Todas exigem reinício, e nenhuma está na tela Configurações e usuários.

environment:
Admission__InstallerKeys__0: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE…"
Admission__MaxPending: "500"
Admission__RequestsPerAddress: "300"
Admission__RequestWindow: "00:01:00"
Admission__PendingExpiry: "7.00:00:00"
Admission__RequireHardwareBackedKeys: "false"
ChavePadrãoSignificado
Admission:InstallerKeysA Installer Key distribuída com o TrustBridgeAs Installer Keys com que este Servidor aceita pedidos de admissão assinados, cada uma um SubjectPublicKeyInfo DER em base64 de uma chave pública ECDSA P-256. Definir esta chave substitui o padrão, em vez de somar a ele. Liste duas durante uma troca: adicione a nova ao lado da antiga, atualize a frota e então remova a entrada antiga. Um valor que não pode ser interpretado recusa a inicialização.
Admission:MaxPending500Quantas máquinas podem estar aguardando um Administrador ao mesmo tempo. Acima disso, o pedido de uma máquina que este Servidor nunca viu é recusado. Zero recusa a inicialização.
Admission:RequestsPerAddress300Quantos pedidos de admissão um endereço de origem pode fazer por janela. É um limite contra incômodo; atrás de NAT, um escritório inteiro é um único endereço, e nenhum header de encaminhamento é considerado.
Admission:RequestWindow1 minA janela fixa do limite acima.
Admission:PendingExpiry7 diasQuanto tempo o pedido de uma máquina fica na fila depois da última vez que o Servidor teve notícias dela. É contado a partir do último pedido, então uma máquina que continua pedindo nunca expira. A expiração não é uma recusa.
Admission:RequireHardwareBackedKeysfalseSe a admissão de uma máquina cuja Chave da Estação de Trabalho não está em hardware deve ser recusada. Essa máquina continua aparecendo na fila, e a tela explica por que o controle Admitir a recusa. A postura é uma declaração da própria máquina; nada a atesta.

O console administrativo​

environment:
Admin__Bootstrap__Email: admin@example.com
Admin__Bootstrap__Password: ${ADMIN_BOOTSTRAP_PASSWORD}
Admin__Bootstrap__DisplayName: Platform Administrator
Admin__SecondFactor__Required: "true"

Admin:Bootstrap:Email, Admin:Bootstrap:Password, Admin:Bootstrap:DisplayName​

Padrão não definido · Override pelo Administrador não · Exige reinício sim

O primeiro Administrador. Lidas num Servidor cuja tabela de contas está vazia, e inertes em todas as inicializações seguintes: uma senha configurada nunca recria uma conta excluída nem redefine uma existente. A senha precisa atender às regras de senha da identidade, ou a conta não é criada e o motivo é registrado no log. Remova as duas depois de entrar. Com elas não definidas e a tabela vazia, o Servidor registra um Warning e não cria nada; ninguém consegue entrar no console até que algo coloque uma conta lá.

Admin:SecondFactor:Required​

Padrão true · Override pelo Administrador não, de propósito · Exige reinício sim

Se uma Conta Administrativa precisa apresentar um segundo fator além da senha. Configuração da implantação, e nunca uma tela: uma opção que desativa o segundo fator, ao alcance de dentro do console que ele protege, é uma opção que um invasor desliga no caminho. Uma linha salva no banco de dados com esta chave é ignorada. Vale para toda a plataforma, sem exceção por conta.

É também o acesso de emergência (break-glass) para um Administrador que perdeu o autenticador; o procedimento está em Segurança. A postura enfraquecida é anunciada a cada inicialização enquanto a opção estiver desligada.

A Trilha de Auditoria​

Audit:RetentionDays​

Padrão 365 · Override pelo Administrador sim · Exige reinício não

Por quanto tempo os eventos de auditoria são mantidos; uma limpeza diária exclui as linhas mais antigas. Abaixo de 1, a inicialização é recusada: uma retenção de zero apagaria toda a trilha na passagem seguinte.

Não há configuração para o destino de uma gravação de auditoria que falhou. Uma entrada que o banco de dados não aceita é gravada no Log do Servidor no nível Critical, com a própria linha, e o console administrativo mostra um alerta. Ela chega até você pelo pipeline de logs que a implantação tiver, então o fallback da auditoria faz parte da sua retenção de logs, e não dos seus backups.

Idiomas​

environment:
Language__DefaultCulture: pt-BR
Language__SupportedCultures__0: en
Language__SupportedCultures__1: pt-BR
ChavePadrãoSignificado
Language:DefaultCultureenO idioma em que é respondida uma requisição sem um Accept-Language utilizável. Não é um idioma de toda a implantação: a preferência do navegador do leitor e o seletor de idioma prevalecem. Um valor fora do conjunto suportado, ou um erro de digitação, recusa a inicialização.
Language:SupportedCulturesvazio, o que significa en e pt-BRTodos os idiomas em que as páginas respondem. Informar um conjunto substitui o padrão.

A superfície do contrato, os logs e a Trilha de Auditoria ficam permanentemente em inglês.

A documentação publicada​

Documentation:ApiReferenceEnabled​

Padrão true · Override pelo Administrador não · Exige reinício sim

Se a referência navegável é servida em /scalar. O documento legível por máquina em /openapi/v1.json é o contrato de integração, é sempre servido e não é afetado. Os dois respondem sem credencial.

O canal das estações de trabalho​

Como uma máquina admitida prova que é ela mesma a cada conexão: uma asserção de curta duração assinada pela Chave da Estação de Trabalho. Nenhuma das duas chaves é algo que uma implantação saudável precise mexer.

ChavePadrãoSignificado
Workstations:ClockSkewTolerance60 sA diferença máxima entre o relógio do Servidor e o de uma estação de trabalho antes que essa máquina não consiga se conectar. Aplicada nas duas pontas. O log do Servidor cita a máquina com o relógio desviado e a diferença (A workstation assertion was refused: Expired ou NotYetValid). Um valor negativo ou acima de uma hora recusa a inicialização.
Workstations:MaxAssertionLifetime5 minA maior janela de validade aceita numa asserção; uma declaração mais longa é recusada. Limita o cache de nonces, que guarda no máximo 100.000 nonces e, quando cheio, recusa em vez de esquecer. Um valor não positivo ou acima de uma hora recusa a inicialização.

O canal está no protocolo 2. O Servidor aceita os protocolos N e N-1. Veja Operação.

O Cofre de Certificados​

environment:
Vault__Enabled: "true"
Vault__RevalidationInterval: "01:00:00"

Vault:Enabled​

Padrão false · Override pelo Administrador não, de propósito · Exige reinício sim

Se o Cofre de Certificados existe neste Servidor, isto é, se ele pode guardar uma chave privada própria. Desligado por padrão porque esse nível torna condicional a premissa fundadora da plataforma; o operador decide ativá-lo. Uma linha salva no banco de dados com esta chave é ignorada, pelo mesmo motivo de Admin:SecondFactor:Required. Ligá-lo coloca a licença do PKI SDK no caminho crítico e traz junto a trava do cofre. Desligá-lo não exclui nada: as linhas permanecem, a revalidação para, e os caminhos que as leriam respondem que este Servidor não tem chaveiro.

Vault:RevalidationInterval​

Padrão 1 h · Override pelo Administrador não · Exige reinício sim

A frequência com que o Servidor verifica de novo o veredito do que o cofre guarda. Não é validada na inicialização: um valor não positivo é informado no nível Critical, e o worker não roda.

Validação de certificados e licença do PKI SDK​

O mesmo nome de seção que o Workstation Service lê, com duas chaves que só fazem sentido lá. No Servidor, só uma implantação com o cofre ligado resolve a licença e o conjunto de âncoras; os timeouts e a janela de tolerância são validados em toda inicialização, de qualquer forma.

environment:
Certificates__Validation__License: ${PKI_LICENSE}
Certificates__Validation__UseIcpBrasil: "true"
Certificates__Validation__UseMachineRootStore: "false"
Certificates__Validation__UseLacunaTestPki: "false"
Certificates__Validation__RevocationGraceWindow: "1.00:00:00"
Certificates__Validation__RevocationTimeout: "00:00:05"
Certificates__Validation__CheckTimeout: "00:00:30"

Certificates:Validation:License​

Padrão não definido · Override pelo Administrador não · Exige reinício sim

Na prática obrigatória quando o cofre está ligado. O LacunaPkiLicense.config inteiro que a Lacuna emite, codificado em base64 numa única linha, e não um caminho. A imagem não traz licença, então uma renovação é uma alteração de configuração e um reinício, e não um novo build.

base64 -w0 LacunaPkiLicense.config
[Convert]::ToBase64String([IO.File]::ReadAllBytes("LacunaPkiLicense.config"))

Uma implantação com cofre e sem licença inicia: uma linha Critical, todos os Certificados do Cofre informando UNTRUSTED e as importações recusadas de imediato. Licença ausente, malformada ou vencida, todas levam a essa mesma linha. Coloque o vencimento dela no calendário que acompanha as renovações de certificados. O SDK só lê uma licença a partir de um arquivo, então o valor é gravado em /tmp/trustbridge-pki e excluído na mesma chamada; um sistema de arquivos somente leitura sem um /tmp gravável não consegue carregar a licença.

As fontes de âncoras​

ChavePadrãoSignificado
Certificates:Validation:UseIcpBrasiltrueConfiar nas raízes da ICP-Brasil que o PKI SDK traz: o conjunto de âncoras de produção, embutido, sem download. Desligar é uma decisão de confiança.
Certificates:Validation:UseMachineRootStorefalseConfiar também no repositório de raízes da própria máquina. No Servidor, um container Linux, não faz nada; é uma opção da estação de trabalho.
Certificates:Validation:UseLacunaTestPkifalseConfiar também na PKI de teste da Lacuna. Somente para desenvolvimento: a Lacuna publica as chaves privadas desses certificados de exemplo. Um Servidor com esta opção ligada registra Critical na inicialização e mostra um banner de aviso em todas as páginas administrativas.
Certificates:Validation:UseServerTrustedCastrueUma opção da estação de trabalho. Inerte no Servidor.
Certificates:Validation:TrustedRootPathsvazioNão é considerada no Servidor. Um Servidor que a encontra definida inicia mesmo assim e registra uma linha Critical citando a chave e a página administrativa que a substituiu. Em vez dela, adicione uma Autoridade Certificadora Confiável em /admin/trusted-cas.

Duas linhas Critical descrevem um conjunto de âncoras que não ancora nada: nenhuma âncora, e âncoras que são só intermediárias, sem raiz autoassinada, de modo que nenhuma cadeia consegue terminar. As duas situações tornam todo certificado UNTRUSTED.

Os limites de revogação​

ChavePadrãoSignificado
Certificates:Validation:RevocationGraceWindow24 h (1.00:00:00)Por quanto tempo a última verificação de revogação bem-sucedida mantém um certificado ACTIVE enquanto a AC dele está inacessível; passado esse prazo, o certificado vira STALE. Esta é a decisão de confiança: exatamente por quanto tempo um certificado continua assinando depois que a AC parou de responder, revogado ou não. Zero é válido e é o mais rigoroso; um valor negativo recusa a inicialização.
Certificates:Validation:RevocationTimeout5 sQuanto tempo um download de LCR ou uma busca de emissor pode levar antes de a AC ser considerada inacessível. Também limita cada busca do percurso AIA da descoberta de Autoridades Certificadoras Confiáveis. Um valor não positivo recusa a inicialização.
Certificates:Validation:CheckTimeout30 sO limite externo de toda a verificação de um certificado, incluindo o fallback para OCSP do SDK, que não tem limite próprio. Zero espera indefinidamente e não é recusado.

Configurações que não são chaves de appsettings​

ConfiguraçãoPertence aOnde
ASPNETCORE_ENVIRONMENTO frameworkNão definida nos dois cenários, e não definida significa Production, o que mantém o appsettings.Development.json inerte.
ASPNETCORE_URLSKestrelhttps://+:8443 no Docker, somente HTTPS. Não definida no App Service.
Kestrel__Certificates__Default__Path / __PasswordKestrelO certificado TLS do próprio Servidor no Docker. Nada a definir no App Service.
WEBSITES_PORTApp Service8080.
WEBSITES_CONTAINER_START_TIME_LIMITApp Service1800, para que uma migração longa não seja encerrada e reiniciada em loop.
ASPNETCORE_FORWARDEDHEADERS_ENABLEDO frameworktrue atrás de qualquer proxy que termine o TLS, ou toda linha de auditoria registra o proxy em vez de quem fez a chamada.
APPLICATIONINSIGHTS_CONNECTION_STRINGApp ServiceLida quando Logging:ApplicationInsights:ConnectionString não está definida.
TMPDIRO processoMove os dois diretórios temporários. De propósito, não existe configuração do TrustBridge para isso.
Ver em Markdown