Erro SChannel 36882 em Tarefa Agendada do Windows: diagnóstico completo e solução TLS

Executar scripts via Agendador de Tarefas pode falhar com o evento SChannel 36882, mesmo que o mesmo código funcione manualmente. Entenda por que o contexto de segurança afeta a negociação TLS e veja passo a passo como resolver definitivamente.

Índice

Visão geral

O Event ID 36882 indica que o handshake TLS foi encerrado porque o certificado de cliente ou de servidor não pôde ser validado (cadeia incompleta, certificado expirado, CRL/OCSP inacessível ou SAN incoerente). Quando o binário é executado manualmente, ele usa a User Store; sob agendamento, o Windows recorre primeiro à Machine Store. Esse simples detalhe faz toda a diferença: o mesmo usuário, a mesma credencial, contextos de segurança diferentes.

Sintomas que entregam o problema

  • A aplicação .NET (Microsoft Identity Client + Graph/Exchange Online) envia e‑mails normalmente ao ser executada em modo interativo.
  • Ao rodar como Tarefa Agendada, nenhuma mensagem sai e o Event Viewer ▸ Windows Logs ▸ System registra SChannel 36882, sub‑código “The certificate received failed chain building.”
  • Logs da aplicação mostram falha no TLS ou erro AuthenticationException contendo RemoteCertificateChainErrors.

Por que acontece?

Contexto de execução

O Agendador de Tarefas, por padrão, coloca processos na Session 0 e pode trocar o token de segurança para contas internas, como NT AUTHORITY\SYSTEM ou NT AUTHORITY\NETWORK SERVICE, mesmo quando você seleciona Executar somente quando o usuário estiver logado. Nesse cenário o processo:

  • Não herda a User Store (HKCU) de certificados.
  • Rodando como serviço, não tem janelas ou caixas de diálogo para exibir detalhes de erro.

Permissões na chave privada

Mesmo que o certificado esteja na Machine Store, o ACL da chave privada (arquivos em %PROGRAMDATA%\Microsoft\Crypto\RSA\MachineKeys) pode estar restrito apenas ao usuário que exportou/instalou o certificado. Sessões de serviço não conseguem ler a chave, o que dispara a falha no handshake.

Política e versões de TLS

Ambientes Windows antigos (ou configurações herdadas via GPO) podem manter TLS 1.0 ou 1.1 habilitado para serviços, mas desativado para usuários. Se o seu cliente .NET tiver SchUseStrongCrypto habilitado, mas o serviço não, a negociação cai em um limbo: o cliente oferece apenas suites modernas, o servidor recusa e o handshake termina em 36882.

Fluxo resumido da autenticação

  1. Processo tenta abrir canal TLS.
  2. SChannel procura certificados na ordem: Machine StoreUser Store.
  3. Encontra a cadeia, valida emitente, revogação, time validity.
  4. Não consegue acessar a chave privada ou a cadeia completa ⇒ handshake falha.

Checklist rápido de solução

EtapaAçãoMotivo
1Marque “Executar se o usuário estiver ou não logado” e “Executar com privilégios mais altos”.Garante mesmo contexto/SID e acesso a lojas de certificados.
2Importe a cadeia completa (raiz e intermediárias) em Computador Local ▸ Autoridades de Certificação.Torna a cadeia visível em Session 0.
3Use certutil –repairstore ou PowerShell para conceder Read na chave privada ao SID da tarefa.Sem ler a chave, SChannel encerra o canal.
4Force TLS 1.2 com ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; ou via registro SchUseStrongCrypto.Evita downgrade para suites rejeitadas.
5Troque o gatilho para Somente se o usuário estiver logado e rode manualmente em prompt elevado para depurar.Permite ver a janela e capturar exceções detalhadas.
6Habilite SChannel logging completo (HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\EventLogging=7).Revela motivos exatos: revocation offline, nome CN errado, etc.

Passo a passo completo

1. Configurar a Tarefa Agendada corretamente

<!-- Interface gráfica -->
✓ Executar se o usuário estiver ou não logado  
✓ Executar com privilégios mais altos  
Conta: CONTOSO\ServiçoEmail  

Ao marcar essas opções, o Agendador cria um token primário que replica o SID do usuário designado, mas o processo continua na Session 0. Ao menos, você garante acesso às stores HKLM e HKCU do perfil carregado.

2. Copiar a cadeia de certificados para a Machine Store

Use o MMC (certlm.msc) ou PowerShell:

# Exporta cadeia do CurrentUser
Get-ChildItem Cert:\CurrentUser\My<Thumbprint> |
    Export-Certificate -FilePath C:\Temp\chain.cer -ChainOption BuildChain

Importa no LocalMachine

Import-Certificate -FilePath C:\Temp\chain.cer -CertStoreLocation Cert:\LocalMachine\My 

Lembre-se de repetir para intermediárias e raiz.

3. Dar permissão na chave privada

Caso o certificado seja de cliente (mútua autenticação), localize o arquivo em %PROGRAMDATA%\Microsoft\Crypto\RSA\MachineKeys e rode:

$cert = Get-ChildItem Cert:\LocalMachine\My | Where Thumbprint -EQ "&lt;Thumbprint&gt;"
$acl = Get-Acl $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "CONTOSO\ServiçoEmail", "Read", "None", "None", "Allow")
$acl.AddAccessRule($rule)
Set-Acl -Path $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName -AclObject $acl

4. Forçar TLS 1.2 / 1.3

Aplicações .NET Framework 4.6+ podem habilitar forte criptografia via registro:

[HKEYLOCALMACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

Em código:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
                                  | SecurityProtocolType.Tls13;

5. Habilitar logs detalhados do SChannel

  1. Abra regedit.
  2. Altere EventLogging para 7.
  3. Reinicie o servidor ou o serviço.
  4. Reproduza o erro e observe Event Viewer ▸ Applications and Services Logs ▸ Microsoft ▸ Windows ▸ Schannel ▸ Diagnostic.

Você verá erros como:

“A fatal alert was generated 40. The internal error state is 1205.”

O código de estado interno define exatamente o ponto de falha.

6. Capturar tráfego com Wireshark

Se ainda restarem dúvidas, filtre pelo porta 443 ou 587:

tcp.port == 443 && (ssl.handshake || tls.handshake)

Compare o ClientHello gerado manualmente com o da Tarefa Agendada. Diferenças de cipher suites ou extensão clientcertificatetype entregam a causa.

Boas práticas para evitar reincidência

  • Automatize a instalação de certificados via GPO ou DSC, garantindo cadeias completas em LocalMachine.
  • Monitoramento proativo: configure alertas de expiração de certificado (e‑mail + Teams).
  • Pinning de algoritmo: declare explicitamente RSA-2048 ou ECC P‑256 nos CSR e evite chaves fracas que podem ser bloqueadas por políticas futuras.
  • Documente as dependências de TLS no pipeline DevOps; mudanças em nível de sistema podem quebrar o build em produção.

Scripts de verificação rápida

Script PowerShell para listar diferenças entre stores

# Lista thumbprints que existem no CurrentUser\My mas não no LocalMachine\My
$cu  = Get-ChildItem Cert:\CurrentUser\My  | Select -ExpandProperty Thumbprint
$lm  = Get-ChildItem Cert:\LocalMachine\My | Select -ExpandProperty Thumbprint
Compare-Object $cu $lm | Where SideIndicator -EQ "&lt;="

Script PowerShell para testar envio de e‑mail em Session 0

Start-Process -FilePath powershell -ArgumentList "-File C:\Scripts\TestEmail.ps1" -Credential (Get-Credential) -NoNewWindow -Wait

Isso simula o comportamento do Agendador sem criá‑lo de fato.

Perguntas frequentes (FAQ)

Posso simplesmente copiar o PFX para LocalMachine e resolver tudo?

Não necessariamente. Se a cadeia de intermediate CAs não estiver completa ou a chave privada não tiver ACL correta, o problema persiste.

Desabilitar a verificação de revogação é uma saída?

Funciona, mas é péssima prática de segurança. Prefira publicar as listas CRL/OCSP em alta disponibilidade ou usar certificados com Must‑Staple.

Existe diferença entre Windows Server 2022 e Windows 10?

SChannel é praticamente igual; contudo, o default do registro SchUseStrongCrypto já vem ativado no Server 2022, reduzindo erros.

Resumo final

O SChannel 36882 em Tarefas Agendadas resulta de discrepâncias de contexto de segurança, localização da cadeia de certificados e permissões de acesso à chave privada. Seguindo as etapas deste guia—executar com privilégios, mover cadeias para Machine Store, corrigir ACLs de chave e forçar TLS 1.2—o handshake TLS se estabiliza e o script volta a enviar e‑mails sem erros.


Resultado esperado: após aplicar as etapas 1‑3 (especialmente executar com privilégios mais altos e copiar a cadeia para Computador Local), a Tarefa Agendada deve autenticar e enviar e‑mails sem gerar o erro SChannel 36882.

Índice