Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用BCryptAddContextFunction和BCryptRemoveContextFunction为TLS 1.2的Schannel密码套件排定优先级_C_Winapi_Encryption_Bcrypt_Tls1.2 - Fatal编程技术网

使用BCryptAddContextFunction和BCryptRemoveContextFunction为TLS 1.2的Schannel密码套件排定优先级

使用BCryptAddContextFunction和BCryptRemoveContextFunction为TLS 1.2的Schannel密码套件排定优先级,c,winapi,encryption,bcrypt,tls1.2,C,Winapi,Encryption,Bcrypt,Tls1.2,我有一份密码套装清单,在我的服务器上应该可以接受。 例如:我只想处理系统中的那些套件 “TLS_ECDHE_RSA_与_AES_128_GCM_SHA256” “TLS_ECDHE_RSA_与_AES_128_CBC_SHA256” “TLS_ECDHE_ECDSA_与_AES_256_GCM_SHA384” 我试着使用了来自中国的样品 但是这只在理论上有效 // for visual c++ #include <stdio.h> #include <windows.h>

我有一份密码套装清单,在我的服务器上应该可以接受。 例如:我只想处理系统中的那些套件

“TLS_ECDHE_RSA_与_AES_128_GCM_SHA256” “TLS_ECDHE_RSA_与_AES_128_CBC_SHA256” “TLS_ECDHE_ECDSA_与_AES_256_GCM_SHA384”

我试着使用了来自中国的样品 但是这只在理论上有效

// for visual c++
#include <stdio.h>
#include <windows.h>
#include <bcrypt.h>
#pragma comment(lib, "Bcrypt.lib")
#ifndef NT_SUCCESS
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#endif

void addToTop(LPWSTR wszCipher){

    SECURITY_STATUS Status = ERROR_SUCCESS;
    wprintf_s(wszCipher);
    printf_s("\r\n");
    Status = BCryptAddContextFunction(
        CRYPT_LOCAL,
        L"SSL",
        NCRYPT_SCHANNEL_INTERFACE,
        wszCipher,
        CRYPT_PRIORITY_TOP);
    if (FAILED(Status))
    {
        printf_s("\n**** Error 0x%x returned by BCryptAddContextFunction\n", Status);
    }

}

void printCipherSuites()
{
    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;
    }

    for (UINT index = 0; index < pBuffer->cFunctions; ++index)
    {
        printf_s("\n%S", pBuffer->rgpszFunctions[index]);
    }
Cleanup:
    if (pBuffer != NULL)
    {
        BCryptFreeBuffer(pBuffer);
    }
    getchar();
}

int removeSth()
{
    printf_s("\nRemoving TLS_RSA_WITH_AES_128_CBC_SHA256");
    LPWSTR wszCipher = L"TLS_RSA_WITH_AES_128_CBC_SHA256";
    SECURITY_STATUS Status = ERROR_SUCCESS;

    Status = BCryptRemoveContextFunction(
        CRYPT_LOCAL,
        L"SSL",
        NCRYPT_SCHANNEL_INTERFACE,
        wszCipher);
    if (FAILED(Status))
    {
        printf_s("\n**** Error 0x%x returned by BCryptRemoveContextFunction\n", Status);
    }
    return 0;
}
void main()
{
    addToTop(L"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256");
    addToTop(L"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256");
    addToTop(L"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384");
    printCipherSuites();
}
<代码> //用于Visual C++ #包括 #包括 #包括 #pragma注释(lib,“Bcrypt.lib”) #ifndef NT_成功 #定义NT_成功(状态)((NTSTATUS)(状态)>=0) #恩迪夫 void addToTop(LPWSTR wszCipher){ 安全\状态状态=错误\成功; wprintf_s(wszCipher); 打印文件(“\r\n”); 状态=BCryptAddContextFunction( CRYPT_LOCAL, L“SSL”, NCRYPT_SCHANNEL_接口, wszCipher, 地下室(优先级最高); 如果(失败(状态)) { printf_s(“\n****BCryptAddContextFunction返回的错误0x%x”,状态); } } 作废打印密码套件() { HRESULT Status=错误\成功; DWORD cbBuffer=0; PCRYPT_CONTEXT_函数pBuffer=NULL; 状态=BCryptEnumContextFunctions( CRYPT_LOCAL, L“SSL”, NCRYPT_SCHANNEL_接口, &cbBuffer, &pBuffer); 如果(失败(状态)) { printf_s(“\n****BCryptEnumContextFunctions返回的错误0x%x”,状态); 去清理; } 如果(pBuffer==NULL) { printf_s(“\n****从BCryptEnumContextFunctions返回的错误pBuffer为null”); 去清理; } 对于(UINT index=0;indexcffunctions;++index) { printf_s(“\n%s”,pBuffer->rgpszFunctions[index]); } 清理: if(pBuffer!=NULL) { BCryptFreeBuffer(pBuffer); } getchar(); } int removeSth() { printf_s(“\n使用AES_128_CBC_SHA256删除TLS_RSA_”); LPWSTR wszCipher=L“TLS_RSA_,带AES_128_CBC_SHA256”; 安全\状态状态=错误\成功; 状态=BCryptRemoveContextFunction( CRYPT_LOCAL, L“SSL”, NCRYPT_SCHANNEL_接口, wszCipher); 如果(失败(状态)) { printf_s(“\n****BCryptRemoveContextFunction返回的错误0x%x”,状态); } 返回0; } void main() { addToTop(L“TLS_ECDHE_RSA_,带AES_128_GCM_SHA256”); addToTop(L“TLS_ECDHE_RSA_,带AES_128_CBC_SHA256”); 添加TOTOP(L“TLS_ECDHE_ECDSA_,带AES_256_GCM_SHA384”); PrintCipherSuite(); } 您可以看到-调用BCryptAddContextFunction不会改变系统中的任何内容。但是,我没有此调用的失败状态—当我列出所有密码套件时—列表中没有带AES的TLS_ECDHE_RSA_128_GCM_SHA256、带AES的LS_ECDHE_RSA_128_CBC_SHA256、带AES的TLS_ECDHE_ECDSA_256_GCM_SHA384

我找不到工作的WinAPI示例。我应该在我的代码中更改什么来区分Schannel密码套件的优先级

编辑: 我发现了一件有趣的事。。。WinApi删除/添加函数返回状态\u SUCCESS-但SSL密码套件列表未更新

我们也无法在中看到BCryptAddContextFunction/BCryptRemoveContextFunction的结果 gpedit.msc,计算机配置->管理模板->网络->本地组策略编辑器->SSL密码套件顺序