Priorizando pacotes de criptografia do Schannel

API de criptografia: o CNG (Next Generation) fornece funções que consultam, adicionam, removem e priorizam os pacotes de criptografia compatíveis com um provedor. As alterações feitas usando essas funções entrarão em vigor imediatamente e não exigem a reinicialização de um servidor ativo.

Observação

Você também pode modificar a lista de pacotes de criptografia definindo as configurações de política de grupo do SSL Cipher Suite Order usando o snap-in objeto Política de Grupo no Console de Gerenciamento da Microsoft.

Para definir a configuração da política de grupo Ordem do Pacote de Criptografia SSL

  1. Em um prompt de comando, insira gpedit.msc. O Editor de Objetos Política de Grupo é exibido.
  2. Expanda Configuração do Computador, Modelos Administrativos, Rede e clique em Configurações de SSL.
  3. Em Configurações de SSL, clique na configuração Ordem do Pacote de Criptografia SSL .
  4. No painel Ordem do Pacote de Criptografia SSL , role até a parte inferior do painel.
  5. Siga as instruções rotuladas como Como modificar essa configuração.

É necessário reiniciar o computador depois de modificar essa configuração para que as alterações entrem em vigor.

 

A lista de pacotes de criptografia é limitada a 1023 caracteres.

Para priorizar os pacotes de criptografia Schannel, confira os exemplos a seguir.

Listando pacotes de criptografia com suporte

Chame a função BCryptEnumContextFunctions para listar os pacotes de criptografia compatíveis com um provedor na ordem de prioridade.

O exemplo a seguir demonstra como usar a função BCryptEnumContextFunctions para listar pacotes de criptografia com suporte.

#include <stdio.h>
#include <windows.h>
#include <bcrypt.h>


void main()
{

   HRESULT Status = ERROR_SUCCESS;
   DWORD   cbBuffer = 0;
   PCRYPT_CONTEXT_FUNCTIONS pBuffer = NULL;

    Status = BCryptEnumContextFunctions(
        CRYPT_LOCAL,
        L"SSL",
        NCRYPT_SCHANNEL_INTERFACE,
        &cbBuffer,
        &pBuffer);
    if(FAILED(Status))
    {
        printf_s("\n**** Error 0x%x returned by BCryptEnumContextFunctions\n", Status);
        goto Cleanup;
    }
                
    if(pBuffer == NULL)
    {
        printf_s("\n**** Error pBuffer returned from BCryptEnumContextFunctions is null");
        goto Cleanup;
    }

    printf_s("\n\n Listing Cipher Suites ");
    for(UINT index = 0; index < pBuffer->cFunctions; ++index)
    {
        printf_s("\n%S", pBuffer->rgpszFunctions[index]);
    }

Cleanup:
    if (pBuffer != NULL)
    {
        BCryptFreeBuffer(pBuffer);
    }
}


Adicionando, removendo e priorizando pacotes de criptografia

Chame as funções BCryptAddContextFunction e BCryptRemoveContextFunction para adicionar e remover pacotes de criptografia da lista de pacotes de criptografia com suporte.

Ao adicionar um conjunto de criptografias, defina o valor do parâmetro dwPosition da função BCryptAddContextFunction como CRYPT_PRIORITY_TOP para adicioná-lo à parte superior da lista priorizada ou para CRYPT_PRIORITY_BOTTOM adicioná-lo à parte inferior da lista.

Para priorizar a lista de pacotes de criptografia, remova todos os pacotes de criptografia da lista e adicione pacotes de criptografia à lista na ordem desejada.

O exemplo a seguir mostra como adicionar um conjunto de criptografias à parte superior da lista priorizada para o Provedor Schannel padrão da Microsoft.

#include <stdio.h>
#include <windows.h>
#include <bcrypt.h>


void main()
{
    
    SECURITY_STATUS Status = ERROR_SUCCESS;
    LPWSTR wszCipher = (L"RSA_EXPORT1024_DES_CBC_SHA");
       
    Status = BCryptAddContextFunction(
                CRYPT_LOCAL,
                L"SSL",
                NCRYPT_SCHANNEL_INTERFACE,
                wszCipher,
                CRYPT_PRIORITY_TOP);
}


O exemplo a seguir mostra como remover um conjunto de criptografias da lista priorizada para o Provedor Schannel padrão da Microsoft.

#include <stdio.h>
#include <windows.h>
#include <bcrypt.h>


void main()
{
    
    SECURITY_STATUS Status = ERROR_SUCCESS;
      LPWSTR wszCipher = (L"TLS_RSA_WITH_RC4_128_SHA");
       
    Status = BCryptRemoveContextFunction(
                CRYPT_LOCAL,
                L"SSL",
                NCRYPT_SCHANNEL_INTERFACE,
                wszCipher);
}