Schannel 暗号スイートの優先順位付け
Cryptography API: Next Generation (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);
}