1

我在使用 gss_export_name 导出名称时遇到问题,虽然一旦名称被导出,我应该能够打印它,但我打开了一个空白字面导出名称:,导出名称长度: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 回答