确定 Schannel 密码套件的优先级
加密 API:下一代 (CNG) 提供查询、添加、删除提供程序支持的密码套件并设置其优先级的函数。 使用这些函数所做的更改会立即生效,不需要重启活动服务器。
注意
还可以通过在 Microsoft 管理控制台中使用 组策略 对象管理单元配置 SSL 密码套件订单组策略设置来修改密码套件列表。
配置 SSL 密码套件订单 组策略设置
- 在命令提示符处输入 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 函数,以从支持的密码套件列表中添加和删除密码套件。
添加密码套件时,请将 BCryptAddContextFunction 函数的 dwPosition 参数的值设置为 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);
}