我试图在Windows主机上获取Administrator的凭据。 我在mingw64_shell下。
这是我的凭证:
$ klist 凭据缓存:FILE:/ tmp / krb5cc_1049076 负责人:Administrator@CORP.PEROKSID.COM
已发布到期校长 1月4日10:14:07 2016年1月4日20:14:07 krbtgt/CORP.PEROKSID.COM@CORP.PEROKSID.COM
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <gss.h>
static void doDisplay(const char *m,OM_uint32 code,int type)
{
OM_uint32 maj_stat, min_stat;
gss_buffer_desc msg;
OM_uint32 msg_ctx;
msg_ctx = 0;
while (1)
{
maj_stat = gss_display_status(&min_stat, code,
type, GSS_C_NULL_OID,
&msg_ctx, &msg);
printf("GSS-API error %s - type: %s code: %d, msg: %s\n", m,
type == GSS_C_GSS_CODE ? "major" : "minor",
code,
(char *)msg.value);
gss_release_buffer(&min_stat, &msg);
if (!msg_ctx)
break;
}
}
void displayError(const char *msg, OM_uint32 maj_stat, OM_uint32 min_stat)
{
doDisplay(msg, maj_stat, GSS_C_GSS_CODE);
doDisplay(msg, min_stat, GSS_C_MECH_CODE);
}
int getCreds(const char *service_name, gss_cred_id_t *server_creds)
{
printf ("Test name: %s\n", service_name);
gss_buffer_desc name_buf;
gss_name_t server_name;
OM_uint32 maj_stat, min_stat;
name_buf.value = service_name;
//name_buf.length = strlen(name_buf.value) + 1;
name_buf.length = strlen(name_buf.value);
maj_stat = gss_import_name(&min_stat, &name_buf,
(gss_OID) GSS_C_NT_HOSTBASED_SERVICE, &server_name);
if (maj_stat != GSS_S_COMPLETE)
{
displayError("importing name", maj_stat, min_stat);
return -1;
}
maj_stat = gss_acquire_cred(&min_stat, server_name, 0,
GSS_C_NULL_OID_SET, GSS_C_ACCEPT,
server_creds, NULL, NULL);
if (maj_stat != GSS_S_COMPLETE)
{
displayError("acquiring credentials", maj_stat, min_stat);
return -1;
}
(void) gss_release_name(&min_stat, &server_name);
return 0;
}
int main(int argc, char** argv) {
gss_cred_id_t gsscreds;
if(getCreds(argv[1], &gsscreds) != 0)
return 1;
}
我已将其编译为a.exe。我跑了:
$ ./a.exe' Administrator@CORP.PEROKSID.COM' 测试名称:Administrator@CORP.PEROKSID.COM GSS-API错误获取凭据 - 类型:主要代码:458752,msg:未提供凭据,或凭据不可用或无法访问 GSS-API错误获取凭证 - 类型:次要代码:11,msg:keytab中没有主体匹配所需名称
我如何解决此错误?
答案 0 :(得分:0)
您可能误解了API。您使用GSS_C_NT_HOSTBASED_SERVICE
导入的服务器名称是目标服务器。 gss_acquire_cred
需要initiate
个问题。 accept
用于服务器/服务。服务仅适用于keytabs,客户端使用缓存或客户端keytabs。由于您拥有用户主体的有效凭据缓存,因此您希望使用客户端重新启动来启动上下文。