0

使用 Schannel成功创建安全连接后,我使用QueryContextAttributes () 获取其连接属性,通过SECPKG_ATTR_CONNECTION_INFO.

返回的结构SecPkgContext_ConnectionInfo包含 field aiExch,其中包含我正在寻找的信息 - 即使用的密钥交换算法。

我已经使用了几个月,它总是返回两个预定义值之一,CALG_RSA_KEYX或者CALG_DH_EPHEM.但是几周后(当我相信微软发布了 Schannel 更新补丁时)它返回了一个未知值:0x0000ae06

使用这些宏,可以将 ALG_ID 拆分为其组件:

#define GET_ALG_CLASS(x)                (x & (7 << 13))
#define GET_ALG_TYPE(x)                 (x & (15 << 9))
#define GET_ALG_SID(x)                  (x & (511))

据此,0x0000ae06将意味着:

类:ALG_CLASS_KEY_EXCHANGE
类型:(7 << 9)->未定义的
SID:6->其含义取决于算法的类型

有人遇到同样的问题吗?谁能解释发生了什么,或者0x0000ae06代表什么?

4

1 回答 1

1

看看这里的代码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 并查看包含的帮助和标题。

于 2015-02-26T10:16:40.780 回答