krb5 ライブラリを使用して、Unix システムに Kerberos Constrained Delegation を実装しようとしています。概念は、「信頼できる」ユーザーがシステム内の別のユーザーに代わって kerberos チケットを取得できるというものです。このコードを実装のベースとして使用しています: http://fossies.org/dox/krb5-1.11.5/t__s4u_8c_source.html
現時点では、信頼できるユーザーに代わってチケットを生成できます。チケットは交換サーバーによって受け入れられたようですが、ここで説明されているようにサーバーがチャレンジを送り返す最後のステップがあり、残念ながら私にとっては失敗しています: https://www.rfc-editor.org/rfc/rfc4559 (たとえば、第 5 章を参照してください)
サーバーから「Negotiate」タグを受け取り、それをデコードする必要があります。
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 を呼び出す必要があると想定するのは正しいですか?
ご助力ありがとうございます。不明な点がありましたら、お問い合わせください。詳細をお知らせします。