确定 Schannel 密码套件的优先级

加密 API:下一代 (CNG) 提供查询、添加、删除提供程序支持的密码套件并设置其优先级的函数。 使用这些函数所做的更改会立即生效,不需要重启活动服务器。

注意

还可以通过在 Microsoft 管理控制台中使用 组策略 对象管理单元配置 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>
#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);
    }
}


添加、删除和确定密码套件的优先级

调用 BCryptAddContextFunctionBCryptRemoveContextFunction 函数,以从支持的密码套件列表中添加和删除密码套件。

添加密码套件时,请将 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);
}