使用krb5库的Kerberos约束委派失败,错误消息为GSS_S_BAD_MECH

时间:2014-07-09 16:11:52

标签: c unix authentication kerberos kerberos-delegation

我正在尝试使用krb5库在Unix系统上实现Kerberos约束委派。 这个概念是一个受信任的"用户将能够代表系统中的另一个用户获得kerberos票证。 我使用此代码作为我的实现的基础: http://fossies.org/dox/krb5-1.11.5/t__s4u_8c_source.html

目前,我可以代表可信用户生成票证;该票证似乎被交换服务器接受,但是服务器发送挑战的最后一步如此处所描述的那样,遗憾的是我失败了: http://tools.ietf.org/html/rfc4559(例如,见第5章)

我收到"谈判"来自服务器的标签,我需要解码它:

       S: HTTP/1.1 401 Unauthorized
       S: WWW-Authenticate: Negotiate 749efa7b23409c20b92356

"客户端将解码gssapi-data,将其传递给    Gss_Init_security_context,并将新的gssapi-data返回给    。服务器"

为了做到这一点,我在" Negotiate"之后解码(base64)数据。字符串并将其强制转换为此结构:

struct gssapi_data {
    gss_ctx_id_t context_hdl;
    gss_name_t client_name;
    gss_cred_id_t delegated_cred_handle;
    void *mech_data;

};

以下是我对此数据的处理方式:

data = (struct gssapi_data*) k5_base64_decode(enc_gssapi_data + strlen("Negotiate "));

if (data == NULL)
{
    syslog(LOG_ERR, "Could not decode gssapi_data");
    return -1;
}


major = gss_init_sec_context(&minor,
                             data->delegated_cred_handle,
                             &(data->context_hdl),
                             data->client_name,
                             &(data->mech_data),
                             GSS_C_REPLAY_FLAG | GSS_C_SEQUENCE_FLAG,
                             GSS_C_INDEFINITE, GSS_C_NO_CHANNEL_BINDINGS,
                             GSS_C_NO_BUFFER, NULL, &kcd_ticket_desc, NULL,
                             &time_rec);

此操作失败,并显示错误消息:GSS_S_BAD_MECH ...

这似乎表明mech_data是错误的,但我不明白为什么。 什么可能是错的? 我是否正确地假设我需要从服务器解码令牌,将其转换为gss_api结构然后用此调用gss_init_sec_context?

非常感谢你的帮助。 如果问题不明确,请询问,我会尝试提供更多详细信息

0 个答案:

没有答案