Приоритеты комплектов шифров Schannel

API шифрования: CNG следующего поколения предоставляет функции, которые запрашивают, добавляют, удаляют и определяют приоритеты наборов шифров, поддерживаемых поставщиком. Изменения, внесенные с помощью этих функций, вступают в силу немедленно и не требуют перезапуска активного сервера.

Примечание

Вы также можете изменить список наборов шифров, настроив параметры групповой политики заказа комплекта шифров SSL, используя оснастку объекта групповая политика в консоли управления Майкрософт.

Настройка параметра групповой политики заказа набора шифров SSL

  1. В командной строке введите gpedit.msc. Откроется редактор объектов групповая политика.
  2. Разверните узел "Конфигурация компьютера", "Административные шаблоны", "Сеть", а затем щелкните "Конфигурация SSL" Параметры.
  3. В разделе "Конфигурация SSL" Параметры щелкните параметр заказа набора шифров SSL.
  4. В области заказа набора шифров SSL прокрутите страницу вниз.
  5. Следуйте инструкциям, помеченным как изменить этот параметр.

После изменения этого параметра необходимо перезагрузить компьютер, чтобы изменения вступили в силу.

 

Список наборов шифров ограничен 1023 символами.

Чтобы определить приоритеты комплектов шифров Schannel, ознакомьтесь со следующими примерами.

Перечисление поддерживаемых комплектов шифров

Вызовите функцию BCryptEnumContextFunctions , чтобы получить список наборов шифров, поддерживаемых поставщиком в порядке приоритета.

В следующем примере показано, как использовать функцию BCryptEnumContextFunctions для перечисления поддерживаемых наборов шифров.

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


Добавление, удаление и приоритет комплектов шифров

Вызовите функции BCryptAddContextFunction и BCryptRemoveContextFunction , чтобы добавить и удалить наборы шифров из списка поддерживаемых наборов шифров.

При добавлении набора шифров задайте для параметра dwPosition функции BCryptAddContextFunctionзначение CRYPT_PRIORITY_TOP, чтобы добавить его в верхнюю часть списка, или CRYPT_PRIORITY_BOTTOM, чтобы добавить его в нижнюю часть списка.

Чтобы приоритизировать список наборов шифров, удалите все наборы шифров из списка, а затем добавьте наборы шифров в список в нужном порядке.

В следующем примере показано, как добавить набор шифров в начало списка с приоритетом для поставщика 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);
}


В следующем примере показано, как удалить набор шифров из списка с приоритетом для поставщика 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);
}