Informações da propriedade KeySpec do AD FS e do certificado

Especificação de chave ("KeySpec") é uma propriedade associada a um certificado e uma chave. Ela especifica se uma chave privada associada a um certificado pode ser usada para assinatura, criptografia ou ambos.

Um valor KeySpec incorreto pode causar erros de Proxy de aplicativo Web e do AD FS, como:

  • Falha ao estabelecer uma conexão SSL/TLS com o AD FS ou o Proxy de aplicativo Web, sem eventos do AD FS registrados (embora os eventos SChannel 36888 e 36874 possam ser registrados)
  • Falha ao entrar na página de autenticação baseada em formulários do AD FS ou WAP, sem mensagem de erro na página.

O seguinte evento pode ser exibido no log de eventos:

Log Name:   AD FS Tracing/Debug
Source: AD FS Tracing
Date:   2/12/2015 9:03:08 AM
Event ID:   67
Task Category: None
Level:  Error
Keywords:   ADFSProtocol
User:   S-1-5-21-3723329422-3858836549-556620232-1580884
Computer:   ADFS1.contoso.com
Description:
Ignore corrupted SSO cookie.

O que causa o problema

A propriedade KeySpec identifica como uma chave gerada ou recuperada usando o CAPI (Microsoft CryptoAPI), de um CSP (Provedor de Armazenamento Criptográfico) herdado da Microsoft, pode ser usada.

Um valor KeySpec de 1 ou AT_KEYEXCHANGE pode ser usado para assinatura e criptografia. Um valor de 2 ou AT_SIGNATURE é usado apenas para assinatura.

A configuração incorreta do KeySpec mais comum é usar um valor 2 para um certificado diferente do certificado de autenticação de tokens.

Para certificados cujas chaves foram geradas usando provedores CNG (Cryptography Next Generation), não há nenhum conceito de especificação de chave e o valor KeySpec sempre é zero.

Saiba como marcar um valor KeySpec válido na próxima seção deste artigo.

Exemplo

Um exemplo de um CSP herdado é o Microsoft Enhanced Cryptographic Provider.

O formato de blob de chaves CSP do Microsoft RSA inclui um identificador de algoritmo, CALG_RSA_KEYX ou CALG_RSA_SIGN, respectivamente, para solicitações de serviço para chaves AT_KEYEXCHANGE **ou **AT_SIGNATURE.

Os identificadores de algoritmo de chave RSA são mapeados para valores KeySpec da seguinte maneira

Algoritmo com suporte do provedor Valor de especificação de chave para chamadas CAPI
CALG_RSA_KEYX: chave RSA que pode ser usada para assinatura e descriptografia AT_KEYEXCHANGE(ou KeySpec=1)
CALG_RSA_SIGN: chave somente de assinatura RSA AT_SIGNATURE(ou KeySpec=2)

Valores KeySpec e significados associados

Estes são os significados dos diversos valores KeySpec:

Valor de KeySpec Significa Uso recomendado do AD FS
0 O certificado é um certificado CNG Somente certificado SSL
1 Para um certificado CAPI (não CNG) herdado, a chave pode ser usada para autenticação e descriptografia SSL, autenticação de tokens, descriptografia de token, certificados de comunicação de serviço
2 Para um certificado CAPI (não CNG) herdado, a chave só pode ser usada para autenticação não recomendável

Como verificar o valor KeySpec dos certificados/chaves

Para ver o valor dos certificados, você pode usar a ferramenta de linha de comando certutil.

Veja este exemplo: certutil –v –store my. Esse comando despeja as informações do certificado na tela.

Keyspec cert

Em CERT_KEY_PROV_INFO_PROP_ID, procure duas coisas:

  • ProviderType: indica se o certificado usa um CSP (Provedor de Armazenamento Criptográfico) herdado ou um Provedor de Armazenamento de Chaves com base em APIs de CNG (Certificate Next Generation) mais recentes. Qualquer valor diferente de zero indica um provedor herdado.

  • KeySpec: a seguinte tabela mostra os valores KeySpec válidos para um certificado do AD FS:

    Provedor CSP herdado (ProviderType diferente de 0):

    Finalidade do certificado do AD FS Valores de KeySpec válidos
    Comunicação de serviço 1
    Descriptografia de token 1
    Assinatura de token 1 e 2
    SSL 1

    Provedor CNG (ProviderType = 0):

    Finalidade do certificado do AD FS Valores de KeySpec válidos
    SSL 0

Como alterar o keyspec do certificado para um valor com suporte

A alteração do valor KeySpec não exige que o certificado seja regenerado ou reemitido. O KeySpec pode ser alterado importando novamente o certificado completo e a chave privada de um arquivo PFX para o repositório de certificados seguindo as etapas abaixo.

  1. Verifique e registre as permissões de chave privada no certificado existente para que elas possam ser configuradas novamente, se necessário, após a nova importação.
  2. Exporte o certificado, incluindo a chave privada para um arquivo PFX.
  3. Execute as etapas a seguir para cada servidor AD FS e WAP.
    1. Exclua o certificado (do servidor AD FS/WAP).
    2. Abra um prompt de comando com privilégios elevados do PowerShell.
    3. Importe o arquivo PFX em cada servidor AD FS e WAP usando a seguinte sintaxe, especificando o valor AT_KEYEXCHANGE (que funciona para todos os fins de certificado do AD FS):
      1. certutil –importpfx certfile.pfx AT_KEYEXCHANGE
      2. Insira a senha do PFX.
    4. Depois que o processo acima for concluído, faça o seguinte:
      1. Verifique as permissões de chave privada.
      2. Reinicie o serviço AD FS ou WAP.