我正在尝试使用python-kerberos(1.0.90-3.el6)初始化GSSAPI服务器端身份验证的上下文。 我的问题是myserver.localdomain被转换为myserver - 我给定的主体的一部分被切掉了。为什么会这样?
示例失败:
>>> import kerberos
>>> kerberos.authGSSServerInit("HTTP@myserver.localdomain")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
kerberos.GSSError: (('Unspecified GSS failure. Minor code may provide more information', 851968), ('Unknown error', 0))
>>>
在KRB5_TRACE的帮助下,我明白了:
[1257] 1346344556.406343: Retrieving HTTP/myserver@LOCALDOMAIN from WRFILE:/etc/krb5.keytab (vno 0, enctype 0) with result: -1765328203/No key table entry found for HTTP/myserver@LOCALDOMAIN
我无法生成普通HTTP / myserver @ LOCALDOMAIN的密钥表,因为它会强制用户访问具有此类地址的服务器。我需要让函数使用正确的FQDN名称。据我所知,authGSSServerInit应该可以使用FQDN而不会破坏它。
我认为python-kerberos方法调用以下krb5-libs(1.9-33.el6)提供的函数,问题也可能在那些:
maj_stat = gss_import_name(&min_stat, &name_token, GSS_C_NT_HOSTBASED_SERVICE, &state->server_name);
maj_stat = gss_acquire_cred(&min_stat, state->server_name,GSS_C_INDEFINITE,GSS_C_NO_OID_SET, GSS_C_ACCEPT, &state->server_creds, NULL, NULL);
在此主机上正确配置了kerberos,并确认其可以正常工作。我可以作为用户使用kinit,并对票证进行身份验证。只是authGSSServerInit无法正常运行。
答案 0 :(得分:3)
部分文档具有误导性:
def authGSSServerInit(service):
"""
Initializes a context for GSSAPI server-side authentication with the given service principal.
authGSSServerClean must be called after this function returns an OK result to dispose of
the context once all GSSAPI operations are complete.
@param service: a string containing the service principal in the form 'type@fqdn'
(e.g. 'imap@mail.apple.com').
@return: a tuple of (result, context) where result is the result code (see above) and
context is an opaque value that will need to be passed to subsequent functions.
"""
事实上,API只期望类型。例如“HTTP”。在解析器(3)的帮助下生成其余的主体。虽然其余的kerberos东西很高兴使用短名称解析器生成FQDN,但只有正确设置了dnsdomainname。
答案 1 :(得分:0)
有关完整性的更多信息,请在python命令中包含以下变量:
例如:
reduce
在python中运行:
KRB5_TRACE=/path-to-log/file.log KRB5_CONFIG='/etc/krb5.conf' KTNAME=/etc/security/keytabs/foo.keytab /opt/anaconda3.5/bin/python3.6
考虑:
如果返回代码为0,您就完成了! Congratz!
如果没有转到日志文件并享受调试:P