1

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

目前,我能够代表受信任的用户生成票证;票据似乎已被交换服务器接受,但最后一步是服务器发送回一个挑战,如此处所述,不幸的是,这对我来说失败了: https ://www.rfc-editor.org/rfc/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?

非常感谢您的帮助。如果有不清楚的地方,请询问,我会尽力提供更多细节

4

0 回答 0