【问题标题】:GSSAPI: gss_export_name returns a blankGSSAPI:gss_export_name 返回空白
【发布时间】:2013-12-14 04:33:07
【问题描述】:

我在使用 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 欣赏任何想法

【问题讨论】:

  • 我所做的挖掘表明您需要在gss_export_name 之前调用gss_canonicalize_name。但我无法在工作代码中验证这一点。
  • 我的印象是,只有在从字符串而不是从活动凭据中导入名称时才需要规范化。无论哪种方式,在我的其他试验中,我都这样做了,但仍然空白。缓冲区可能不包含文本值并且需要进一步解码。希望有更多的一点

标签: c kerberos gssapi


【解决方案1】:

不幸的是,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 输出会更好。

【讨论】:

  • gss_display_name 完全符合我的要求,谢谢!
猜你喜欢
  • 2018-12-23
  • 2017-11-20
  • 1970-01-01
  • 2011-05-27
  • 2012-09-06
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多