我正在尝试使用 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?
非常感谢您的帮助。如果有不清楚的地方,请询问,我会尽力提供更多细节