Priorización de conjuntos de cifrado de Schannel

Cryptography API: Next Generation (CNG) proporciona funciones que consultan, agregan, quitan y priorizan los conjuntos de cifrado que admite un proveedor. Los cambios realizados mediante estas funciones surten efecto inmediatamente y no requieren reiniciar un servidor activo.

Nota:

También puede modificar la lista de conjuntos de cifrado mediante la configuración de la directiva de grupo de pedidos del conjunto de cifrado SSL mediante el complemento Objeto de directiva de grupo en Microsoft Management Console.

Para configurar la configuración de directiva de grupo de pedidos del conjunto de cifrado SSL

  1. En un símbolo del sistema, escriba gpedit.msc. Aparece el Editor de objetos directiva de grupo.
  2. Expanda Configuración del equipo, Plantillas administrativas, Redy, a continuación, haga clic en Configuración de SSL.
  3. En Configuración de SSL, haga clic en la configuración de orden del conjunto de cifrado SSL .
  4. En el panel Orden del conjunto de cifrado SSL , desplácese hasta la parte inferior del panel.
  5. Siga las instrucciones con la etiqueta How to modify this setting (Cómo modificar esta configuración).

Es necesario reiniciar el equipo después de modificar esta configuración para que los cambios surtan efecto.

 

La lista de conjuntos de cifrado está limitada a 1023 caracteres.

Para priorizar los conjuntos de cifrado de Schannel, consulte los ejemplos siguientes.

Enumeración de conjuntos de cifrado admitidos

Llame a la función BCryptEnumContextFunctions para enumerar los conjuntos de cifrado que admite un proveedor en orden de prioridad.

En el ejemplo siguiente se muestra cómo usar la función BCryptEnumContextFunctions para enumerar conjuntos de cifrado admitidos.

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


Agregar, quitar y priorizar conjuntos de cifrado

Llame a las funciones BCryptAddContextFunction y BCryptRemoveContextFunction para agregar y quitar conjuntos de cifrado de la lista de conjuntos de cifrado admitidos.

Al agregar un conjunto de cifrado, establezca el valor del parámetro dwPosition de la función BCryptAddContextFunction en CRYPT_PRIORITY_TOP para agregarlo a la parte superior de la lista prioritaria o para CRYPT_PRIORITY_BOTTOM agregarlo a la parte inferior de la lista.

Para priorizar la lista de conjuntos de cifrado, quite todos los conjuntos de cifrado de la lista y, a continuación, agregue conjuntos de cifrado a la lista en el orden en que desee.

En el ejemplo siguiente se muestra cómo agregar un conjunto de cifrado a la parte superior de la lista prioritaria para el proveedor de Microsoft Schannel predeterminado.

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


En el ejemplo siguiente se muestra cómo quitar un conjunto de cifrado de la lista priorizada para el proveedor de Microsoft Schannel predeterminado.

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