0

我将 SLES11 与 Python2.6 和 Apache Web 应用程序一起使用。我有一个带有 Kerberos 的 Active Directory 服务器,我想在我的应用程序中使用 SSO。

我已经在域EXAMPLE.ORG 中创建了一个服务主体HTTP/host.example.org。该用户被映射到一个虚拟用户 app.dmy@EXAMPLE.ORG。

Kerberos 在 Linux 客户端上运行良好,我可以初始化服务主体

kinit -s HTTP/host.example.org app.dmy@EXAMPLE.ORG

列表

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: app.dmy@EXAMPLE.ORG

Valid starting     Expires            Service principal
09/28/15 14:27:27  09/28/15 14:37:27  HTTP/host.example.org@EXAMPLE.ORG


Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

我的 /etc/krb5.conf 看起来像:

  1 [libdefaults]
  2         ticket_lifetime = 600
  3         default_realm = EXAMPLE.ORG
  4         kdc_req_checksum_type = 2
  5         checksum_type = 2
  6         ccache_type = 1
  7         clockskew = 300
  8
  9 [kdc]
 10         profile = /var/lib/kerberos/krb5kdc/kdc.conf
 11
 12 [logging]
 13         kdc = FILE:/var/log/krb5/kdc.log
 14         admin_server = FILE:/var/log/krb5/adm.log
 15         default = FILE:/var/log/krb5/log.log
 16
 17 [realms]
 18 EXAMPLE.ORG = {
 19         kdc = adserver.example.org:88
 20         admin_server = adserver.example.org:749
 21         default_domain = EXAMPLE.ORG
 22 }
 23
 24 [domain_realm]
 25         example.org = EXAMPLE.ORG
 26         .example.org = EXAMPLE.ORG
 27
 28 [login]
 29         krb4_convert = 0

 30 [appdefaults]
 31         pam = {
 32                 ticket_lifetime = 1d
 33                 renew_lifetime = 1d
 34                 forwardable = true
 35                 proxiable = false
 36                 minimum_uid = 1
 37                 clockskew = 300
 38                 external = sshd
 39                 use_shmem = sshd
 40         }

如果我通过 apache 使用身份验证,并且mod_auth_kerb SSO 工作正常。但是我想对连接有更多的控制,所以禁用了 apache 身份验证并在 python(cherrypy 框架)中编写了我自己的模块。

我安装了 pyKerberos(Kerberos1.2.2 不起作用,python 崩溃并出现分段错误)。

这是我的python代码:

import kerberos
import base64

service = 'HTTP'
hostname = 'host.example.org'
# env.log(kerberos.checkPassword('app.dmy', 'xxx', service, 'EXAMPLE.ORG')
''' for testing works fine '''
spn = kerberos.getServerPrincipalDetails(service, hostname)
''' result service principla from keytab 
    HTTP/host.example.org@EXAMPLE.ORG'''
status, _ctxt = kerberos.authGSSClientInit(spn)
''' status = 1, _ctxt = context object '''
kerberos.authGSSClientStep(_ctxt, base64.b64encode(""))

我在日志中得到以下结果:

(('Unspecified GSS failure.  Minor code may provide more information', 851968), ('No credentials cache found', -1765328189))

缓存文件存在于 tmp 中,spn 用 kinit 注册。

4

1 回答 1

0

你调用了错误的例程。这是服务器端:GSSAPI 接受器,用于验证 HTTP 客户端。您需要调用 authGSSServer{Init,Step}; 就实际进行的 GSSAPI 调用而言,gss_accept_sec_context()。您正在调用 gss_init_sec_context() ,它抱怨在默认 ccache 中没有可用的 TGT 形式的凭据,它可以用来获取服务器的票证。Kerberos 中的服务器不需要相同类型的凭据。相反,他们有一个带有长期密钥的密钥表,并且不需要联系 KDC 来验证客户端。

于 2015-10-01T08:25:24.060 回答