Priorizando o Schannel Cipher Suites

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 Política de Grupo Object no Console de Gerenciamento da Microsoft.

Para definir a configuração de política de grupo do SSL Cipher Suite Order

  1. Em um prompt de comando, insira gpedit.msc. O Editor de Objetos Política de Grupo é exibido.
  2. Expanda a Configuração do Computador, Modelos Administrativos, Rede e clique em Configuração de SSL Configurações.
  3. Em Configurações de Configuração do SSL, clique na configuração de 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 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, consulte 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 em 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 pacote de criptografia, defina o valor do parâmetro dwPosition da função BCryptAddContextFunction para CRYPT_PRIORITY_TOP adicioná-lo à parte superior da lista priorizada ou CRYPT_PRIORITY_BOTTOM para 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 pacote de criptografia à parte superior da lista priorizada para o provedor padrão do Microsoft Schannel.

#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 padrão do Microsoft Schannel.

#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);
}