設定通道加密套件的優先順序
密碼編譯 API:新一代 (CNG) 提供可查詢、新增、移除及設定提供者所支援之加密套件優先順序的函式。 使用這些函式所做的變更會立即生效,而且不需要重新啟動作用中的伺服器。
注意
您也可以使用 Microsoft 管理控制台中的組策略物件嵌入式管理工具,設定 SSL 加密套件順序 的組策略設定,來修改加密套件清單。
設定 SSL 密碼套件排序 群組原則設定
- 在命令提示字元中,輸入 gpedit.msc。 組策略對象編輯器 隨即出現。
- 展開 [計算機設定][系統管理範本][網络],然後按兩下 [SSL 組態設定]。
- 在 [SSL 組態設定]下,按一下 [SSL 加密套件順序] 設定。
- 在 [SSL 加密套件順序] 窗格中,捲動至窗格底部。
- 依照標籤 如何修改此設定的指示。
修改此設定之後,必須重新啟動計算機,變更才會生效。
加密套件清單限制為1023個字元。
若要設定安全通道加密套件的優先順序,請參閱下列範例。
列出支援的加密套件
呼叫 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通道提供者的優先順序清單頂端。
#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通道提供者的優先順序清單中移除加密套件。
#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);
}