Определение приоритетов комплектов шифров Schannel

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

Примечание

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

Настройка параметра групповой политики SSL Cipher Suite Order

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