我正在尝试使用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?
非常感谢你的帮助。 如果问题不明确,请询问,我会尝试提供更多详细信息