首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :使用set_option时选项错误( LDAP )。OPT_X_TLS_CACERTDIR)

Python :使用set_option时选项错误( LDAP )。OPT_X_TLS_CACERTDIR)
EN

Stack Overflow用户
提问于 2017-06-26 08:25:25
回答 1查看 1.5K关注 0票数 0

我使用django身份验证后端django-auth-ldap对LDAP服务进行身份验证。当试图设置包含ssl证书的目录的路径时;

代码语言:javascript
复制
ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, '/etc/ssl/certs')

我得到了一个ValueError异常:

代码语言:javascript
复制
File "/Users/liz/web_application/work/ldap_settings.py", line 5, in <module>
ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, '/etc/ssl/certs')

File "/Users/liz/.envs/dev/lib/python3.6/site-packages/ldap/functions.py", line 139, in set_option
return _ldap_function_call(None,_ldap.set_option,option,invalue)

File "/Users/liz/.envs/dev/lib/python3.6/site-packages/ldap/functions.py", line 66, in _ldap_function_call
result = func(*args,**kwargs)

ValueError: option error

我尝试了这个前一次如此张贴的公认答案,它建议卸载python(虽然我使用的是python的一个分支),并通过运行一个brew安装openldap重新安装:

代码语言:javascript
复制
LDFLAGS="-L/usr/local/brew/opt/openldap/lib" CPPFLAGS="-I/usr/local/brew/opt/openldap/include" pip install python-ldap

这似乎没有任何效果。我还遵循了本指南,在本地构建了一个带有openldap更新版本(通过brew)的pyldap版本,但我仍然看到了同样的错误。我不确定是否有什么方法可以验证我的本地构建是否使用了较新的openldap库,还是这里缺少了什么?任何建议都是非常感谢的!

关于SO的其他现有问题

这个问题的回答对我没有影响;设置AUTH_LDAP_GLOBAL_OPTIONS而不是set_option会导致相同的ValueError

代码语言:javascript
复制
AUTH_LDAP_GLOBAL_OPTIONS = {ldap.OPT_X_TLS_CACERTDIR: '/etc/ssl/certs'}
EN

回答 1

Stack Overflow用户

发布于 2017-06-27 14:06:00

好的,我有一些关于LDAP的工作。所以如果这对你有帮助的话,我会为你提供我的代码。首先,我将cert放入django procject。

代码语言:javascript
复制
BASE_DIR = Djando base dir

def returnPaths():
    return     {'dn_full_path': 'CN=Person,CN=Schema,CN=your_con,DC=your_dc,DC=your_dc',
                'cert': 'path_to_cert_file',
                'host': 'ldaps://x.x.x.:636'
                }

class LdapBackend(object):
    @classmethod
    def authenticate(cls, username=None, password=None):

        try:
            setup = returnPaths()

            ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
            ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, BASE_DIR + setup['cert'])

            domain = 'your_doman'
            l = ldap.initialize(setup['host'])
            l.set_option(ldap.OPT_REFERRALS, 0)
            l.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
            l.set_option(ldap.OPT_X_TLS, ldap.OPT_X_TLS_DEMAND)
            l.set_option(ldap.OPT_X_TLS_DEMAND, True)

            try:
                l.simple_bind_s('%s@%s' % (str(username.encode('utf-8')), domain),
                                password.encode('utf-8'))
                return True
            except ldap.INVALID_CREDENTIALS as e:
                return False
            except Exception as e:
                return False
        except ldap.INVALID_CREDENTIALS as e:
            return False
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44755646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档