Pular para o conteúdo principal

Configuração da estação de trabalho

Todas as configurações que o Workstation Service aceita e como uma instalação na frota as fornece. As configurações do Servidor estão em Configuração do Servidor; os dois hosts não compartilham nenhuma configuração. O Tray App não tem nenhum arquivo de configuração (veja a última seção).

Todo valor aqui tem um padrão, e a maioria das máquinas da frota não altera nenhum deles. Três valores chegam pelo MSI e pela Diretiva de Grupo; os demais ficam no arquivo de configuração que o MSI instala ao lado dos binários.

Como um valor chega a uma máquina​

A última fonte a definir uma chave prevalece:

FonteO que a fornece
1appsettings.json ao lado dos bináriosInstalado pelo MSI em Program Files. Nada no serviço o regrava.
2appsettings.Development.json, user secretsSomente a execução de um desenvolvedor no console.
3HKLM\Software\TrustBridge, a preferênciaO MSI, a partir de SERVER_URL, PKI_LICENSE e INSTALLER_KEY. Um reparo ou uma gravação manual com elevação grava os mesmos valores no mesmo lugar.
4Variáveis de ambiente, __ no lugar de :Uma execução no console ou um wrapper de serviço. Não é assim que uma instalação na frota funciona.
5Argumentos de linha de comandoSomente uma execução no console.
6HKLM\Software\Policies\TrustBridge, a diretivaA Diretiva de Grupo, por meio do modelo ADMX fornecido. Somente o mecanismo de diretivas pode gravar ali.

Três valores chegam pelo Registro: ServerUrl vira Server:Url, PkiLicense vira Certificates:Validation:License e InstallerKey vira Server:InstallerKey. Um valor publicado com o tipo de Registro errado (um REG_DWORD onde se esperava uma string) impede a inicialização, citando o local. Os dois locais do Registro são lidos uma vez, na inicialização: uma atualização de GPO entra em vigor na próxima inicialização do serviço.

Não há segredo que uma instalação entregue a uma máquina para que ela entre na plataforma. Uma máquina gera a própria Chave da Estação de Trabalho, se anuncia e aguarda ser admitida por um Administrador. Nada nesta página é enviado pelo Servidor; a única coisa que o Servidor envia a uma máquina é o conjunto de Autoridades Certificadoras Confiáveis dele, que é política de confiança, e não configuração.

Os formatos de valor são os do Servidor: : em um arquivo e __ no ambiente, durações como [d.]hh:mm:ss, com a armadilha dos vinte e quatro dias, e tamanhos como inteiros simples.

Acessando o Servidor​

{
"Server": {
"Url": "https://trustbridge.example.com",
"InstallerKey": "MIGHAgEAMBMGByqGSM49…",
"InitialReconnectDelay": "00:00:01",
"MaxReconnectDelay": "00:01:00"
}
}

Server:Url​

Padrão não definido · Instalação na frota o MSI grava SERVER_URL em HKLM\Software\TrustBridge\ServerUrl; a Diretiva de Grupo o sobrepõe em HKLM\Software\Policies\TrustBridge\ServerUrl · Valor inválido impede a inicialização

Onde fica o Servidor desta máquina. Obrigatório, e precisa ser um URI absoluto. O MSI recusa primeiro um valor vazio ou sem esquema, na condição de inicialização dele; a verificação do serviço na inicialização é a segunda barreira. O Tray App mostra essa URL e nunca pode defini-la: quem a grava decide onde a máquina pede para ser admitida, então a gravação fica atrás de uma barreira de elevação.

Server:InstallerKey​

Padrão a chave do próprio produto · Instalação na frota o MSI grava INSTALLER_KEY em HKLM\Software\TrustBridge\InstallerKey, somente em uma implantação que gerou uma chave própria · Valor inválido impede a inicialização

A Installer Key com que esta máquina assina a requisição de admissão, além da própria chave: PKCS#8 DER em base64, ECDSA P-256. Ela mostra que a requisição veio do produto genuíno e não autentica nada; toda cópia do TrustBridge tem a metade privada do produto. Uma implantação que queira uma chave própria configura a metade pública no Servidor, em Admission:InstallerKeys, e entrega a metade privada aqui. Defina-a nas máquinas antes que o Servidor deixe de confiar na chave antiga. Não é um segredo. Fica de fora do modelo ADMX, de propósito.

Server:InitialReconnectDelay e Server:MaxReconnectDelay​

Padrão 1 s e 1 min · Instalação na frota nunca alterados · Valor inválido um valor não positivo, ou um teto abaixo do piso, impede a inicialização

Onde começa o backoff de reconexão depois que o canal cai, e o teto até onde ele sobe. Uma máquina que não consegue acessar o Servidor tenta de novo nesse ritmo indefinidamente. Duas falhas são registradas no log em Error, para que possam ser distinguidas de uma instabilidade passageira: o Servidor respondeu 401 no canal (admissão retirada ou revogada), e o Servidor recusou a requisição de admissão (revogada, Installer Key não confiável, requisições demais do endereço ou fila cheia; o log cita as quatro). Aguardar a admissão não é uma falha e é registrado uma vez em Information.

Detecção de certificados​

{
"Certificates": {
"SweepInterval": "00:01:00",
"ValidationInterval": "01:00:00",
"ChangeDebounce": "00:00:02"
}
}
ChavePadrãoSignificado
Certificates:SweepInterval1 minA varredura de reconciliação, sempre ativa: uma enumeração com comparação de todos os repositórios, que cobre um gatilho de mudança perdido ou um token que nunca aparece como smart card. Um valor não positivo impede a inicialização.
Certificates:ValidationInterval1 hA frequência com que todo certificado presente é validado de novo por completo, para que uma revogação, uma expiração ou o fim de uma janela de tolerância apareça dentro de um intervalo.
Certificates:ChangeDebounce2 sQuanto tempo o pipeline aguarda depois de um sinal de mudança antes de enumerar, para que a chegada de um cartão seja agrupada e o middleware tenha tempo de tornar os certificados legíveis. Fora do intervalo de zero a 5 minutos, impede a inicialização. Um valor baixo demais custa uma varredura inteira; um alto demais custa um segundo de latência.

Os repositórios de certificados​

{
"Certificates": {
"WindowsStore": { "Enabled": true },
"Pkcs11": { "Modules": "C:\\Windows\\System32\\eTPKCS11.dll;C:\\Vendors\\uncommon-p11.dll" }
}
}

Certificates:WindowsStore:Enabled​

Padrão true · Instalação na frota decisão do administrador · Valor inválido impede a inicialização

Se o repositório de certificados do Windows da máquina (LocalMachine\My) é lido em busca de certificados A1. Ligado, um A1 instalado ali é enumerado, validado e anunciado como qualquer outro certificado, com o leitor ignorando tudo o que não seja uma identidade de assinatura (sem chave privada, ou sem CPF de e-CPF). A notificação de mudanças do repositório fica aberta, para que uma importação seja anunciada dentro de ChangeDebounce. Desligado, nada na máquina abre esse repositório. Lido uma vez, na inicialização.

Um certificado A1 é anunciado e fica visível no Tray App, mas uma Sessão de Assinatura sobre ele ainda espera um PIN que nenhum A1 tem; por isso, sessões e assinaturas com um Certificado de Estação de Trabalho A1 são recusadas até que o fluxo sem PIN seja lançado. Um A1 importado no Cofre de Certificados é, hoje, a forma suportada de assinar com um deles.

Certificates:Pkcs11:Modules​

Padrão não definido, o que significa a lista de fabricantes fornecida · Instalação na frota nunca alterado em uma máquina com middleware comum · Valor inválido um módulo que não carrega é uma falha desse repositório no log, e não uma inicialização recusada

Os módulos PKCS#11 dos fabricantes, por meio dos quais os tokens A3 são lidos, como uma única string de caminhos absolutos separados por ponto e vírgula. Três estados:

  • Não definido é a lista padrão fornecida: SafeNet Authentication Client, SafeSign IC, Watchdata PROTON, Feitian ePass2003, Idemia AWP e Thales IDPrime, nos caminhos em que esses fabricantes os instalam, verificados pela existência do arquivo. Frotas comuns têm detecção de tokens sem nenhuma configuração.
  • Definido é exatamente o que está na lista, por inteiro; nada é verificado e nenhum padrão é mantido. É assim que se adiciona um middleware incomum, ao custo de também listar os comuns de que a máquina precisa.
  • Definido como vazio desliga a detecção de A3. Por variável de ambiente, desligado é Certificates__Pkcs11__Modules=";", porque uma variável que não existe é lida como não definida.

Cada módulo é um repositório próprio e eles falham isoladamente: um middleware com falha custa apenas os certificados daquele fabricante, que passam a STALE ao longo da janela de tolerância. A enumeração nunca envolve um PIN e não consome nada do contador de tentativas de um token. Lido uma vez, na inicialização.

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

O mesmo nome de seção e a mesma política que o Servidor lê. Quatro coisas são diferentes em uma estação de trabalho, e cada uma é destacada abaixo.

{
"Certificates": {
"Validation": {
"License": "PD94bWwgdmVyc2lvbj0…",
"UseIcpBrasil": true,
"UseMachineRootStore": false,
"UseLacunaTestPki": false,
"UseServerTrustedCas": true,
"TrustedRootPaths": ["C:\\ProgramData\\TrustBridge\\anchors\\your-root.pem"],
"RevocationGraceWindow": "1.00:00:00",
"RevocationTimeout": "00:00:05",
"CheckTimeout": "00:00:30"
}
}
}

Certificates:Validation:License​

Padrão não definido · Instalação na frota o MSI grava PKI_LICENSE em HKLM\Software\TrustBridge\PkiLicense; a Diretiva de Grupo o sobrepõe em HKLM\Software\Policies\TrustBridge\PkiLicense · Valor inválido uma licença vencida ou corrompida gera uma linha Critical na inicialização; um valor de Registro do tipo errado impede a inicialização

Obrigatória em todas as máquinas, e essa é a primeira diferença em relação ao Servidor. Aqui, o SDK é o que lê qualquer certificado; sem licença, todo certificado da máquina aparece como UNTRUSTED e a máquina não assina nada. O valor é a própria licença, codificada em base64 em uma linha, e não um caminho. O local da diretiva está no modelo ADMX de propósito: um vencimento da licença seria, de outra forma, uma indisponibilidade da frota, e uma atualização de GPO é como uma renovação chega à frota, com cada máquina adotando-a na próxima inicialização do serviço.

As fontes de âncoras​

ChavePadrãoSignificado
Certificates:Validation:UseIcpBrasiltrueAs raízes da ICP-Brasil que o SDK traz. Desligá-la é uma decisão de confiança.
Certificates:Validation:UseMachineRootStorefalseA segunda diferença: aqui ela tem efeito. Confia em todas as ACs públicas do programa de raízes do Windows, um conjunto muito mais amplo que a ICP-Brasil.
Certificates:Validation:UseLacunaTestPkifalseConfia também na PKI de testes da Lacuna. Somente para desenvolvimento: a Lacuna publica as chaves privadas correspondentes. O serviço avisa isso em Critical a cada inicialização.

Certificates:Validation:UseServerTrustedCas​

Padrão true · Instalação na frota o arquivo de configuração que o MSI instala (esta chave não tem valor no Registro, então nenhuma GPO a alcança) · Valor inválido impede a inicialização

A terceira diferença: esta chave só tem efeito em uma máquina. Define se a máquina incorpora as Autoridades Certificadoras Confiáveis do Servidor ao próprio conjunto de âncoras. Ligada, a máquina pede o conjunto ao Servidor depois de cada handshake e pede de novo quando o Servidor avisa que ele mudou; assim, uma AC que um Administrador adiciona na tela Autoridades Certificadoras Confiáveis chega aos vereditos desta máquina em segundos. O último conjunto recebido fica em cache localmente e continua valendo enquanto o Servidor estiver inacessível: um Servidor que não responde não disse nada, e só um Servidor respondendo, inclusive respondendo nenhuma Autoridade Certificadora Confiável, substitui o que a máquina tem.

Enquanto esta máquina tiver um conjunto não vazio recebido do Servidor, TrustedRootPaths é totalmente desconsiderado, e o serviço avisa isso em Critical, citando os caminhos descartados. Um controle que só acrescentasse confiança nunca conseguiria retirá-la.

Desligada, a máquina nunca pede e valida apenas contra a própria configuração, TrustedRootPaths incluído: é a postura para uma frota com um pipeline próprio de âncoras, sob controle de mudanças. Desligá-la em toda a frota é uma alteração no arquivo de configuração de cada máquina, e vale a pena planejá-la antes de atualizar o Servidor para o protocolo 2, e não depois. De qualquer forma, a máquina informa em qual postura está a cada conexão, e a tela Estações de Trabalho a mostra por máquina.

Certificates:Validation:TrustedRootPaths​

Padrão vazio · Instalação na frota decisão do administrador, implantada junto com os arquivos de âncora · Valor inválido um arquivo ilegível gera uma linha Critical, e não uma inicialização recusada

Como uma AC privada é adicionada a partir de um arquivo nesta máquina. Não é mais a palavra final: a forma suportada de confiar em uma AC privada em toda a frota é uma Autoridade Certificadora Confiável adicionada uma vez no Servidor. Esta chave ainda decide a resposta inteira em uma máquina em que UseServerTrustedCas está desligado, em uma que nunca teve contato com um Servidor, em uma cujo Servidor não tem Autoridades Certificadoras Confiáveis ou em uma que ainda está no protocolo 1.

A quarta diferença: estes precisam ser caminhos absolutos. Quem consegue adicionar um arquivo aqui consegue fazer um certificado próprio ser validado como ACTIVE, então os arquivos devem ficar em C:\ProgramData\TrustBridge\anchors\, cuja ACL pertence ao instalador. Sem nenhuma âncora, o serviço ainda inicia e todo certificado aparece como UNTRUSTED, com uma linha Critical citando as configurações; arquivos de âncora que contêm só intermediárias geram uma segunda linha, diferente.

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; depois disso, o certificado passa a STALE. Ampliar este valor é ampliar o tempo durante o qual um certificado revogado continua assinando enquanto a AC dele está inacessível. Um valor negativo impede a inicialização.
Certificates:Validation:RevocationTimeout5 sQuanto tempo o download de uma LCR ou a busca de um emissor pode levar antes de a AC ser considerada inacessível. Um valor não positivo impede a inicialização.
Certificates:Validation:CheckTimeout30 sO limite externo da verificação inteira de um certificado. As validações são feitas em série na máquina, então uma verificação sem limite trava todos os certificados atrás dela. Zero espera indefinidamente.

Enquanto o Servidor e esta máquina estão em versões diferentes​

UseServerTrustedCas só tem efeito em um canal no protocolo 2, e um Servidor e uma frota nunca são atualizados no mesmo minuto. A ordem de atualização é primeiro o Servidor, depois as estações de trabalho, dentro de um mesmo ciclo de versão, e ela tem consequências:

  • Um Servidor à frente desta máquina se conecta e simplesmente nunca pede. Uma máquina no protocolo 1 faz o handshake, assina e informa vereditos como sempre fez, e continua validando contra o próprio TrustedRootPaths. Uma Autoridade Certificadora Confiável adicionada no Servidor não chega a ela, e a tela Estações de Trabalho mostra Requer atualização na linha dela.
  • Esta máquina à frente do Servidor não se conecta. O Servidor mais antigo recusa o handshake (Protocol version 2 is newer than this server's supported window (0–1); update the Server first), e esta máquina não consegue assinar até que o Servidor seja atualizado.

O canal entre o Service e o Tray​

O canal por named pipe entre o serviço e o Tray App. A ACL dele admite usuários interativos, e esse é todo o controle de acesso dele. Uma instalação na frota não mexe em nada disto.

{
"Tray": {
"PipeName": "TrustBridge.WorkstationService",
"PromptTimeout": "00:01:30",
"MaxConsecutivePinFailures": 3,
"PinFailureCooldown": "00:05:00",
"LogBufferSize": 500
}
}
ChavePadrãoSignificado
Tray:PipeNameTrustBridge.WorkstationServiceO pipe em que o serviço escuta. Configurável só para que um desenvolvedor possa executar uma segunda instância; o Tray App se conecta ao nome conhecido e não tem configuração própria. Um valor em branco impede a inicialização.
Tray:PromptTimeout90 sQuanto tempo uma solicitação de PIN fica na tela do usuário antes de o serviço desistir dela. Deliberadamente mais folgado que o Sessions:PinPromptTimeout do Servidor (60 s), e precisa continuar assim: um Servidor que desistiu não consegue mandar esta máquina fechar a solicitação, então é esta janela que encerra toda solicitação não respondida.
Tray:MaxConsecutivePinFailures3Quantos PINs um token pode rejeitar seguidamente antes que as entradas para aquele certificado sejam recusadas sem ser repassadas. Limita um processo que tenta milhares de vezes, não uma pessoa: o usuário ainda pode bloquear o próprio token digitando errado. Zero impede a inicialização.
Tray:PinFailureCooldown5 minPor quanto tempo as entradas para um certificado são recusadas depois que esse limite é atingido. Não é um estado do token; nenhum PUK está envolvido.
Tray:LogBufferSize500Quantas entradas recentes de log o serviço guarda para o painel de diagnóstico do Tray. Somente em memória.

O Cache de PIN​

Local e controlado pelo administrador. O Servidor não envia nada para cá, e nenhuma chamada do Tray ou da API pode alterá-lo. Uma linha a cada inicialização informa em qual postura a máquina está.

{
"PinCache": {
"SurviveRestart": false,
"Ttl": "08:00:00",
"SweepInterval": "00:05:00",
"StorePath": "C:\\ProgramData\\TrustBridge\\pin-cache.dat",
"KeyRingPath": "C:\\ProgramData\\TrustBridge\\keys"
}
}

PinCache:SurviveRestart​

Padrão false · Instalação na frota decisão do administrador, e um desvio documentado

Se os PINs em cache sobrevivem a um reinício do serviço ou da máquina. Desligado, as entradas são criptografadas com um chaveiro que só existe no processo em execução, então parar o serviço destrói o meio de lê-las. Ligado, o chaveiro é persistido em KeyRingPath, protegido com DPAPI no escopo da máquina, e o texto cifrado vai para StorePath, em um arquivo cuja ACL admite apenas SYSTEM e Administradores. Em qualquer caso, o TTL fica selado dentro do texto cifrado, então um reinício não consegue zerá-lo e editar o arquivo não consegue estendê-lo.

Ligá-lo é um desvio documentado do gatilho de encerramento do requisito de middleware da ICP-Brasil (REQUISITO-MW II.27), que o TrustBridge trata como uma diretriz porque fica acima do middleware do fabricante. Uma máquina com ele ligado avisa isso em Warning a cada inicialização.

O restante do Cache de PIN​

ChavePadrãoSignificado
PinCache:Ttl8 hQuanto tempo uma entrada vive sem ser usada. Deslizante: cada uso renova a expiração, então um usuário ativo todo dia nunca é solicitado de novo. Um valor não positivo impede a inicialização.
PinCache:SweepInterval5 minA frequência com que entradas inativas são removidas da memória. De qualquer forma, nada consegue obter um PIN expirado.
PinCache:StorePath%ProgramData%\TrustBridge\pin-cache.datOnde o texto cifrado é gravado. Nunca é gravado enquanto a sobrevivência estiver desligada.
PinCache:KeyRingPath%ProgramData%\TrustBridge\keysOnde fica o chaveiro persistido. Não é usado enquanto a sobrevivência estiver desligada.

Logs​

A configuração do próprio framework, no mesmo formato da do Servidor. O arquivo fornecido define Default como Information e reduz duas categorias do cliente SignalR a Warning. Duas linhas que um administrador deve reconhecer no nível padrão: em qual postura do Cache de PIN a máquina está (a cada inicialização) e que o mecanismo de tokens falsos para desenvolvimento está ativo (a cada inicialização, em qualquer máquina com uma seção FakeTokens). Uma seção FakeTokens não deve existir em uma máquina em que alguém assine: ela faz certificados fabricados serem validados como ACTIVE.

O Tray App não lê nenhum arquivo de configuração​

Não há appsettings.json para o Tray App. As opções dele são construídas no código: o nome do pipe e a versão de protocolo a que ele se conecta, o intervalo de reconexão e a tolerância de expiração da solicitação são compilados, e o idioma que ele exibe vem da cultura de interface do Windows do usuário conectado, e não de uma configuração. O que molda o canal entre os dois é a seção Tray acima, que é lida pelo serviço.

Ver em Markdown