如何使用gsasl gssapi进行Active Directory身份验证?

3

我正在尝试使用gsasl认证到Active Directory域。我已经作为管理员kinit了。我试图遵循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);
}

有人看出我错在哪里了吗?

1个回答

0

没有一个清晰的答案,因为我目前不使用AD,所以无法验证我的答案。但是为了定位问题:

我会先尝试示例。也许这个测试是故意失败的。如果示例无法工作,我会调查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()还有许多其他状态码。因此,我会更改库的代码并打印出一个更清晰的错误代码,说明为什么它无法工作。

WINBIND/SAMBA也存在问题,不知道您是否使用SAMBA,在这个特定的函数中引发了一个未指定的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接