我正在尝试使用 gsasl 向 Active Directory 域进行身份验证。我已经 kinit'd 作为管理员。我尝试遵循 gsasl tests/gssapi.c 中的测试代码,但调用 gsasl_step64() 时,下面的代码失败并出现 GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR。

static int callback(Gsasl *ctx, Gsasl_session *sctx, Gsasl_property prop) 
{ 
    int ret = GSASL_NO_CALLBACK; 
 
    switch (prop) { 
        case GSASL_AUTHZID: 
            gsasl_property_set(sctx, GSASL_AUTHZID, "Administrator"); 
            ret = GSASL_OK; 
            break; 
 
        case GSASL_SERVICE: 
            gsasl_property_set(sctx, prop, "host"); 
            ret = GSASL_OK; 
            break; 
 
        case GSASL_HOSTNAME: 
            char hostname[HOST_NAME_MAX]; 
            gethostname(hostname, HOST_NAME_MAX); 
            gsasl_property_set(sctx, prop, hostname); 
            ret = GSASL_OK; 
            break; 
 
        default: 
            break; 
    } 
 
    return ret; 
} 
 
int main() 
{ 
    Gsasl *ctx = NULL; 
    Gsasl_session *session; 
    char *s1 = NULL, *s2 = NULL; 
    int ret; 
 
    ret = gsasl_init(&ctx); 
    if (ret != GSASL_OK) { 
        cerr << "gsasl_init failed" << endl; 
        return ret; 
    } 
 
    if (!gsasl_client_support_p(ctx, "GSSAPI")) { 
        cerr << "No support for GSSAPI." << endl; 
        return 77; 
    } 
 
    gsasl_callback_set(ctx, callback); 
 
    ret = gsasl_client_start(ctx, "GSSAPI", &session); 
    if (ret != GSASL_OK) { 
        cerr << "gsasl_client_start failed" << endl; 
        return ret; 
    } 
 
    do { 
        ret = gsasl_step64(session, s2, &s1); 
        gsasl_free(s2); 
        if (ret != GSASL_OK && ret != GSASL_NEEDS_MORE) { 
            cerr << "gsasl_step64 failed " << ret << endl; 
            return ret; 
        } 
    } while (ret != GSASL_OK); 
 
    if (s1) { 
        gsasl_free(s1); 
    } 
 
    gsasl_finish(session); 
} 

有人看到我做错了什么吗?

请您参考如下方法:

不是一个明确的答案,因为我目前不使用 AD,所以我无法验证我的答案。但要定位问题:

我会尝试 examples第一的。也许希望这个测试失败。如果它不适用于示例,我会调查 GNU SASL 库的库源。

这里是库源代码的摘录,它引发了这个错误:

maj_stat = gss_init_sec_context (&min_stat, 
                                    GSS_C_NO_CREDENTIAL, 
                                    &state->context, 
                                    state->service, 
                                    state->mech_oid, 
                                    GSS_C_MUTUAL_FLAG, 
                                     0, 
                                    &state->cb, 
                                    buf, 
                                    &actual_mech_type, 
                                    &state->token, &ret_flags, NULL); 
 
if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED) 
    return GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR; 

如您所见,函数 gss_init_sec_context() 被调用,在 if 子句中只有 GSS_S_COMPLETEGSS_S_CONTINUE_NEEDED 将被测试。但是 gss_init_sec_context() 还有更多 status codes .所以我会更改库的代码并打印出更清晰的错误代码,为什么它不起作用。

还有一个 issue在 WINBIND/SAMBA 中,不知道你是否使用 SAMBA,它会在这个特定的函数中抛出一个未指定的错误。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!