我正在尝试使用 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_COMPLETE
和 GSS_S_CONTINUE_NEEDED
将被测试。但是 gss_init_sec_context()
还有更多 status codes .所以我会更改库的代码并打印出更清晰的错误代码,为什么它不起作用。
还有一个 issue在 WINBIND/SAMBA 中,不知道你是否使用 SAMBA,它会在这个特定的函数中抛出一个未指定的错误。