1

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 を呼び出す必要があると想定するのは正しいですか?

ご助力ありがとうございます。不明な点がありましたら、お問い合わせください。詳細をお知らせします。

4

0 に答える 0