Windows上的gss_acquire_cred

时间:2016-01-04 18:53:46

标签: kerberos gssapi

我试图在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中没有主体匹配所需名称

我如何解决此错误?

1 个答案:

答案 0 :(得分:0)

您可能误解了API。您使用GSS_C_NT_HOSTBASED_SERVICE导入的服务器名称是目标服务器。 gss_acquire_cred需要initiate个问题。 accept用于服务器/服务。服务仅适用于keytabs,客户端使用缓存或客户端keytabs。由于您拥有用户主体的有效凭据缓存,因此您希望使用客户端重新启动来启动上下文。