【问题标题】:SASL bind over GSSAPI using kerberos credentials with ldap_sasl_bind_s function使用带有 ldap_sasl_bind_s 函数的 kerberos 凭据通过 GSSAPI 绑定 SASL
【发布时间】:2015-12-09 20:57:33
【问题描述】:

我正在尝试使用带有 ldap_sasl_bind_s 函数的 kerberos 凭据通过 GSSAPI 实现 SASL 绑定。我遵循ldap_sasl_bind_s(GSSAPI) - What should be provided in the credentials BERVAL structure链中描述的步骤

我得到了上述链中描述的所有调用的预期返回值,直到最后一次(第三次)调用 ldap_sasl_bind_s,该调用因 LDAP_INVALID_CREDENTIALS 错误而失败。我还看到 Windows 事件查看器中发生以下错误

Error value:
80090308: LdapErr: DSID-0C0904D1, comment: AcceptSecurityContext error, data 5, v1771

请注意我有两个应用程序,我们称它们为客户端和服务器,客户端在某个活动域帐户下运行,服务器应用程序从客户端接收凭据并尝试使用客户端提供的令牌绑定到 ldap。 这是我做的步骤。客户来电

int res = AcquireCredentialsHandle(NULL, "Kerberos"  , SECPKG_CRED_BOTH,NULL, NULL, NULL, NULL, &credhandle1, &expry1); 

填充 credhandle1 后,我将它传递给客户端的 InitializeSecurityContext 的第一次调用

  res = InitializeSecurityContext(&credhandle1,NULL,(SEC_CHAR*)(&spn1[0]),ISC_REQ_INTEGRITY|ISC_REQ_MUTUAL_AUTH|ISC_REQ_SEQUENCE_DETECT|ISC_REQ_CONFIDENTIALITY|ISC_REQ_DELEGATE,0,SECURITY_NATIVE_DREP ,NULL,0,&NewContext2,&sec_buffer_desc1,&contextattr2,&expry2);

我使用我的活动目录设置中可用的 spn-s 之一。此调用返回 SEC_I_CONTINUE_NEEDED,并填充 sec_buffer_desc1,然后将其传递给我的服务器应用程序以使用构造的令牌调用 ldap_sasl_bind_s。

第一次调用ldap_sasl_bind_s返回LDAP_SUCCESS,并填充struct berval *servresp,这里是调用

rc1 = ldap_sasl_bind_s(ld1, "", "GSSAPI", &cred1, NULL, NULL, &servresp);

servresp 中的令牌被传递给执行 InitializeSecurityContext 的第二次调用的客户端应用程序,如下所示

res = InitializeSecurityContext(&credhandle1, &NewContext2, (SEC_CHAR*)(&spn1[0]),ISC_REQ_INTEGRITY|ISC_REQ_MUTUAL_AUTH|ISC_REQ_SEQUENCE_DETECT|ISC_REQ_CONFIDENTIALITY|ISC_REQ_DELEGATE,0, 0, &InBuffDesc3, 0, &NewContext3, &sec_buffer_desc3, &contextattr3, &expry3);

InBuffDesc3 包含从服务器返回的凭据。 此调用返回 SEC_E_OK,并在 sec_buffer_desc3 中生成空输出令牌, 此令牌被传递给第二次调用 ldap_sasl_bind_s 的服务器

rc1 = ldap_sasl_bind_s(ld1, "", "GSSAPI", &cred2, NULL, NULL, &servresp2);

此调用再次返回 LDAP_SUCCESS 并用 32 字节长的令牌填充 servresp2,然后将其传递给客户端。服务器中的最后一条错误消息是 LDAP_SASL_BIND_IN_PROGRESS。

我将 DecryptMessage NewContext2(在 InitSecContext 调用中收到)作为第一个参数传递。作为第二个参数传递给 DecryptMessage 的 BuffDesc 包含指向两个 SecBuffer 对象的指针,SecBuffer[0] 的类型为 SECBUFFER_STREAM 并包含服务器响应(由第二次调用 ldap_sasl_bind_s 生成的令牌)和 SecBuffer[1] 的类型为 SECBUFFER_DATA。在 DecryptMessage 调用 SecBuffer[1 之后] 被一些令牌填充(它的大小也在改变,所以我认为它包含解密的消息)。 DecryptMessage 的第三个参数为 0,最后一个参数在解密消息后由 SECQOP_WRAP_NO_ENCRYPT 值填充。这是电话

ULONG ulQop;
res = DecryptMessage( &NewContext2, &BuffDesc, 0, &ulQop); 

在传递给 DecryptMessage 的 SECBUFFER_DATA 缓冲区中,我收到 4 个字节长的令牌(这似乎是输入 SECBUFFER_STREAM 缓冲区的最后 4 个字节)。 “decrypted message(SecBuff[1].pvBuffer)”的第一个字节是7,那么我做如下

    unsigned char * ptr = (unsigned char *)SecBuff[1].pvBuffer;
    int maxsize = (ptr[1]<<16) | (ptr[2]<<8)| (ptr[3]);
    ptr = (unsigned char *) malloc(4);
    ptr[0]= 4;
    ptr[1]= maxsize>>16;
    ptr[2]= maxsize>>8;
    ptr[3]= maxsize; 

我正在使用 EncryptMessage 构造输入 SecBufferDesc 对象 三个缓冲区,第一个具有 SECBUFFER_TOKEN 类型,在 EncryptMEssage 调用后填充(所以我认为它在此调用后包含加密消息),第二个具有 SECBUFFER_DATA 类型并包含我在上面构建的 ptr,以及 SECBUFFER_PADDING 类型的第三个缓冲区。 我如下调用 EncryptMessage

err = EncryptMessage(&NewContext2,fQOP,&inSecBufDescSecond, 0);

它返回 SEC_E_OK,并在缓冲区中生成 28 字节长的令牌,类型为 SECBUFFER_TOKEN,然后将此输出令牌传递给我的服务器应用程序,该服务器应用程序将此令牌作为客户端凭据调用 ldap_sasl_bind_s,并因无效凭据错误而失败。

我查看了帖子中提到的 RFC,还试图找到任何具有 SASL 和 kerberos 凭据的工作示例,但是无法处理此错误。 任何帮助将不胜感激,您能否帮助我深入了解此问题,或提供一些工作代码示例以便我查看。

谢谢! -格里戈尔

【问题讨论】:

  • Cyrus SASL 不支持 SSPI,仅支持 GSS-API。您是否考虑过实现一个合适的插件而不是满足循环?
  • 嗨,迈克尔,感谢您的回复。实际上我不使用 Cyrus 我使用 SSPI。
  • 是的,你知道,因此得名ldap_sasl_bind_s。 OpenLDAP 使用 Cyrus SASL 进行所有 SASL 操作...或者您是否使用 Windows 原生 LDAP 方法?
  • 是的,我不使用 Open Ldap。我使用 Winows 原生 LDAP 方法。目前我正在尝试为我的应用程序的 Windows Active Directory 用户实现单点登录。我的服务器应用程序应该支持使用 LDAP 服务器的 Kerberos 身份验证(而不是直接连接到 Kerberos 服务器)。我的服务器不应该是 Active Directory (Kerberos) 域的一部分。
  • 为什么? Microsoft implementation 已经通过 SSPI 实现了机甲 GSSAPIGSS-SPNEGO。如果您计划传递替代凭证,请使用berval 结构。将 SSPI 凭据句柄分配给 berval 结构的值和 sizeof 的长度。应该是 8 个字节。首先尝试在没有 conf 和 int 的情况下仅实现 auth。

标签: c++ active-directory ldap sspi gssapi


【解决方案1】:

我遇到了完全相同的问题,我想我找到了解决方案:

您在第三个 ldap_sasl_bind_s 调用中发送的消息应该是 所有三个 给 EncryptMessage 的缓冲区的串联(按照 TOKEN、DATA、PADDING 的顺序)

当我这样做时,它会起作用!

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多