看看这里的代码http://pastebin.com/TKQJ85Z9请注意,ID 已添加到 schannel 库中,但显然 VC 标头没有更新,无论如何,正如您从上面的代码中看到的那样(请参阅 pastebin URL),该 ID 对应于“ECDHE”,即具有临时密钥交换的椭圆曲线 DH
[编辑]
真正的问题是该值是非官方的,只能通过一些互联网搜索找到,这就是为什么我发布了一些示例代码的链接;看,我只是碰巧通过查看此推特找到答案https://twitter.com/ericlaw/status/301083494203928576
无论如何,听起来 Microsoft CNG SDK 的最新版本包含更新的标头和库,它们为“ QueryContextAttributes ”API 调用添加了一个新常量,即SECPKG_ATTR_CIPHER_INFO这样的调用返回一个结构(参见下面代码中的定义),其名为“ szCipherSuite ”的成员报告正在使用的密码的完整字符串,例如“ TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384 ”
这是此类调用的一些示例代码
/*
// -- http://www.microsoft.com/en-us/download/details.aspx?id=1251
typedef struct _SecPkgContext_CipherInfo
{
DWORD dwVersion;
DWORD dwProtocol;
DWORD dwCipherSuite;
DWORD dwBaseCipherSuite;
WCHAR szCipherSuite[SZ_ALG_MAX_SIZE];
WCHAR szCipher[SZ_ALG_MAX_SIZE];
DWORD dwCipherLen;
DWORD dwCipherBlockLen; // in bytes
WCHAR szHash[SZ_ALG_MAX_SIZE];
DWORD dwHashLen;
WCHAR szExchange[SZ_ALG_MAX_SIZE];
DWORD dwMinExchangeLen;
DWORD dwMaxExchangeLen;
WCHAR szCertificate[SZ_ALG_MAX_SIZE];
DWORD dwKeyType;
} SecPkgContext_CipherInfo, *PSecPkgContext_CipherInfo;
*/
static void DisplayConnectionInfo(CtxtHandle *phContext)
{
SECURITY_STATUS Status;
SecPkgContext_CipherInfo CipherInfo = { SECPKGCONTEXT_CIPHERINFO_V1 };
Status = QueryContextAttributes( phContext, SECPKG_ATTR_CIPHER_INFO, &CipherInfo);
if(Status != SEC_E_OK)
{
printf("Error 0x%x querying cipher info\n", Status);
return;
}
printf("%S\n", CipherInfo.szCipherSuite);
}
有关更多信息,请获取 MS CNG SDK 并查看包含的帮助和标题。