1

gss_export_name を使用して名前をエクスポートする際に問題が発生しました。名前がエクスポートされたら、それを印刷するだけでよいはずですが、文字通り EXPORTED NAME: , EXPORTED NAME LENGTH: 47 を空白にしています。

これが私のコードです

OM_uint32 major_status;
gss_cred_usage_t usage;
OM_uint32 lifetime;
gss_name_t inquired_name;
major_status = gss_inquire_cred(&minor_status, GSS_C_NO_CREDENTIAL, &inquired_name,
                             &lifetime, &usage, &oid_set);
gss_buffer_desc exported_name_buffer;
major_status = gss_export_name(&minor_status, inquired_name, &exported_name_buffer);
printf("EXPORTED NAME: %s, EXPORTED NAME LENGTH: %d\n",
       exported_name_buffer.value, exported_name_buffer.length);

わかりやすくするために、チェックを含めないことにしましたが、major_status が常に == GSS_S_COMPLETE であることも確認します

4

1 に答える 1

0

残念ながら、gss_export_name によるバッファー出力は、人間が読める文字列ではなく、ASN.1 データ構造です。RFC 2743のセクション 3.2 を参照. その構造のヘッダーをスキップしてから、メカニズムに依存する方法で名前を解析する必要があります。一部の GSS-API 開発者は、これを行うことを強く推奨しています。例として、Openssh への gss-api パッチは、Kerberos 名を解析するためにこれを行います。これは理論的に正しいアプローチです。ただし、実際には gss_display_name を使用してその呼び出しの出力を処理すると、複数メカニズムのアプリケーションでは奇妙な結果が生じる可能性がありますが、実際にはより移植性の高い結果が得られます。GSS-API コミュニティでは、これを処理する方法について重要な議論を得ることができます。デバッグおよびログ用の出力を生成するために gss_display_name を使用する必要があることに、誰もが同意するでしょう。問題は、アクセス制御リストで検索するための名前が必要な場合はどうすればよいかということです。gss_export_name の出力を直接使用してバイナリ比較を実行できる場合は、それを実行してください。ただし、人間が入力した入力と比較する必要がある場合は、gss_display_name の出力を使用する方が良いと主張しますが、gss_export_name の出力を解析する方が良いと主張する人もいます。

于 2013-12-17T20:52:32.767 に答える