我正在尝试为我的应用程序实现请求TGT的编程逻辑,因此在通过GSSAPI和GSS-SPNEGO机制对LDAP服务器进行身份验证之前,没有必要从命令行调用kinit
。
我创建一个内存ccache,请求一个带有用户名和密码的TGT,然后使用gss\u krb5\u import\u cred导入凭据。在启动身份验证之前,为LDAP结构设置GSSAPI上下文。
下面的示例代码在GSSAPI中运行良好,但当我尝试将机制更改为GSS-SPNEGO时,我会收到本地LDAP错误(-2),并带有以下消息:
SASL(-1):一般故障:GSSAPI错误:未指定的GSS故障。次要代码可能提供更多信息(SPNEGO无法找到协商机制)
int create_krb5_cred(krb5_context ctx, char *realm, char *user,
char *password, krb5_ccache *ccache, gss_cred_id_t *gsscred) {
int rc = 0, minor_stat = 0;
int len = 0;
const char *cname = NULL;
krb5_get_init_creds_opt *cred_opt;
krb5_creds creds;
krb5_principal princ = NULL;
if (realm == NULL || user == NULL || password == NULL) return -1;
rc = krb5_cc_new_unique(ctx, "MEMORY", NULL, ccache);
if (rc != 0) goto clear;
len = strlen(realm);
rc = krb5_build_principal(ctx, &princ, len, realm, user, NULL);
if (rc != 0) goto clear;
rc = krb5_cc_initialize(ctx, *ccache, princ);
if (rc != 0) goto clear;
rc = krb5_get_init_creds_opt_alloc(ctx, &cred_opt);
if (rc != 0) goto clear;
rc = krb5_get_init_creds_password(ctx, &creds, princ, password, 0, NULL, 0, NULL, NULL);
if (rc != 0) goto clear;
rc= krb5_cc_store_cred(ctx, *ccache, &creds);
if (rc != 0) goto clear;
cname = krb5_cc_get_name(ctx, *ccache);
if (cname == NULL) goto clear;
rc = gss_krb5_ccache_name(&minor_stat, cname, NULL);
if (rc != 0) goto clear;
rc = gss_krb5_import_cred(&minor_stat, *ccache, princ, 0, gsscred);
clear:
if (princ != NULL) krb5_free_principal(ctx, princ);
return rc;
}
int remove_krb5_cred(krb5_context ctx, krb5_ccache ccache, gss_cred_id_t *gsscred) {
int rc = 0;
rc = gss_release_cred(NULL, gsscred);
if (rc != 0) return rc;
rc = krb5_cc_destroy(ctx, ccache);
krb5_free_context(ctx);
return rc;
}
int main(void) {
int rc = 0;
krb5_context ctx;
krb5_ccache ccache;
gss_cred_id_t gsscred = NULL;
rc = krb5_init_context(&ctx);
create_krb5_cred(ctx, "EXAMPLE.ORG", "testuser", "secret", &ccache, &gsscred);
LDAP *ld = NULL;
const int version = LDAP_VERSION3;
void *defaults = NULL;
ldap_initialize(&ld, "ldap://example.org");
ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version);
/* Setting the credentials and handling the SASL binding with the `interact` function
(with setting the new GSS context) is not disclosed here...*/
rc = ldap_sasl_interactive_bind_s(ld, NULL, "GSSAPI", NULL, NULL, 0, interact, defaults);
printf("Connect 0x%x\n", rc);
remove_krb5_cred(ctx, ccache, &gsscred);
struct berval *authzid;
rc = ldap_whoami_s(ld, &authzid, NULL, NULL);
printf("RC %d %s\n\n", rc, authzid->bv_val);
}
这篇旧论坛帖子表明,没有为导入的凭据设置SPNEGO oid,因此LDAP将在身份验证期间忽略它。
我曾尝试使用gss\u acquire\u cred函数代替gss\u krb5\u import\u cred,但没有成功接收到TGT(甚至对于GSSAPI)。
欢迎提出任何关于如何通过GSSAPI和GSS-SPNEGO成功认证的想法。
更新:我已经设法将gss_acquire_cred
与GSSAPI和GSS-SPNEGO一起使用,但我必须使用基于文件的凭据缓存而不是基于内存的凭据缓存。
要实现这一目标,需要采取以下几项行动:
如果一切顺利,请继续:
不幸的是,OpenLDAP和Cyrus SASL都是糟糕的文档。我怎么知道它会起作用?我阅读了两者的源代码,以理解并利用该用例。
从读取头文件开始,您将得到一个结果。如果您被卡住,请重新询问。
我想使用ldapsearch从Linux实例(AmazonLinuxOS)对远程Windows服务器进行身份验证测试。Kerberos绑定是通过从包cyrus-sasl-gssapi安装的GSS-API工作的,是否有可用于GSS-SPNEGO的等效包?我希望能够在Kerberos不起作用的情况下回退到NTLM身份验证。 服务器同时支持GSSAPI和GSS-SPNEGO,但从客户端来看,GSS-SP
我有一个复杂的情况,我需要在tomcat 8上实现一个同时提供静态html和rest服务的Web应用程序的安全性。该应用程序是Spring mvc应用程序(没有Spring启动) 身份验证(sso)过程如下所示: 如果http头中不存在用户jwt,则使用ldap进行身份验证,从db获取用户权限,并将jwt创建回用户。 如果标头中存在jwt,则跳过ldap过滤,从令牌中提取用户权限。 我想到了第一个
问题内容: 我正在使用spnego(http://spnego.sourceforge.net)在JBoss下进行kerberos身份验证。 我需要解密kerberos票证才能访问包含PAC数据的授权数据。需要PAC数据来决定要授予用户哪些角色。 如何访问和解密kerberos票?我在网上搜索了示例,但没有任何努力。 问题答案: 这些家伙具有完整的PAC解码实现: http://jaasloung
我试图生成令牌,该令牌可以用作HTTP头,以验证HDFS WebHDFS URL和Oozie REST API URL。我引用了下面的url以生成协商令牌的以下代码。https://www.ibm.com/support/knowledgecenter/en/SS7JFU_8.5.5/com.ibm.websphere.express.doc/ae/tsec_SPNEGO_token.html 但
我正在尝试使用Kerberos在Tomcat9(使用SDK8)中配置SSO。我的环境都在Windows Server 2016 VMS中:- null null 在tomcat服务器中,我创建了文件。/tomcat-9/conf/krb5.ini 我创建了文件。/tomcat-9/conf/jass.conf 到目前为止,在我找到的所有教程中,它都是相当一致的。从现在开始,far west和我对t
问题内容: 有谁知道如何使用Java GSS-API从密钥分发中心(KDC)获取服务票证? 我有一个胖客户端应用程序,该应用程序首先使用Krb5LoginModule通过JAAS进行身份验证以从票证缓存中获取TGT(背景:Windows例如使用kerberos实现,并将票证授予票证存储在安全的存储区域中)。从LoginManager中,我获得包含TGT的Subject对象。现在,我希望当我为我的服