Определение приоритетов комплектов шифров Schannel
API шифрования: следующее поколение (CNG) предоставляет функции, которые запрашивают, добавляют, удаляют и определяют приоритеты наборов шифров, поддерживаемых поставщиком. Изменения, внесенные с помощью этих функций, вступают в силу немедленно и не требуют перезапуска активного сервера.
Примечание
Вы также можете изменить список комплектов шифров, настроив параметры групповой политики порядок комплектов шифров SSL с помощью оснастки групповая политика объект в консоли управления (Майкрософт).
Настройка параметра групповой политики SSL Cipher Suite Order
- В командной строке введите gpedit.msc. Откроется редактор объектов групповая политика.
- Разверните узел Конфигурация компьютера, Административные шаблоны, Сеть, а затем щелкните Параметры конфигурации SSL.
- В разделе Параметры конфигурации SSL щелкните параметр Порядок комплекта шифров SSL .
- В области Порядок комплекта шифров SSL прокрутите экран до нижней части области.
- Следуйте инструкциям с меткой Как изменить этот параметр.
Чтобы изменения вступили в силу, необходимо перезагрузить компьютер после изменения этого параметра.
Список наборов шифров ограничен 1023 символами.
Чтобы определить приоритеты наборов шифров Schannel, см. следующие примеры.
- Список поддерживаемых комплектов шифров
- Добавление, удаление и расстановка приоритетов наборов шифров
Список поддерживаемых комплектов шифров
Вызовите функцию BCryptEnumContextFunctions, чтобы получить список наборов шифров , поддерживаемых поставщиком в порядке приоритета.
В следующем примере показано, как использовать функцию BCryptEnumContextFunctions для перечисления поддерживаемых наборов шифров .
#include <stdio.h>
#include <windows.h>
#include <bcrypt.h>
#pragma comment(lib, "Bcrypt.lib")
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>
#pragma comment(lib, "Bcrypt.lib")
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>
#pragma comment(lib, "Bcrypt.lib")
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);
}