GSSAPI:gss_export_name返回空白

时间:2013-12-14 04:33:07

标签: c kerberos gssapi

我在使用gss_export_name导出名称时遇到问题,我虽然导出名称后我应该能够打印它但是我发现了一个空白的Literaly 出口名称:,出口名称长度: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 欣赏任何想法

1 个答案:

答案 0 :(得分: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输出更好。