Django集成LDAP认证遇证书验证失败,咨询可信证书路径
Django LDAP认证证书查找路径及认证失败问题
我尝试在Django中集成LDAP认证,但认证无法正常进行——即使输入正确的LDAP凭据,用户信息也无法存入Django用户模型。
以下是我的Django项目settings.py文件内容:
AUTH_LDAP_SERVER_URI = 'ldaps://xxxxxx:636' AUTH_LDAP_BIND_DN = 'CN=xxxxx,OU=Service,OU=Accounts,OU=SF_SAP,DC=sf,DC=priv' AUTH_LDAP_BIND_PASSWORD = 'xxxxxxxx' AUTH_LDAP_USER_SEARCH = LDAPSearch('OU=User,OU=Accounts,OU=SF_SAP, DC=sf,DC=priv',ldap.SCOPE_SUBTREE, '(CN=%(user)s)') AUTH_LDAP_USER_ATTR_MAP = { "first_name": "givenName", "last_name": "sn", "email": "mail", "username": "uid", "password": "userPassword", } AUTH_LDAP_PROFILE_ATTR_MAP = { "home_directory": "homeDirectory" } AUTH_LDAP_ALWAYS_UPDATE_USER = True AUTH_LDAP_CACHE_TIMEOUT = 3600 AUTHENTICATION_BACKENDS = ( 'django_auth_ldap.backend.LDAPBackend', 'django.contrib.auth.backends.ModelBackend', )
我启用了LDAP日志,日志中出现如下错误:
Binding as CN=xxxxxxxxx,OU=Service,OU=Accounts,OU=SF_SAP,DC=sf,DC=priv Caught LDAPError while authenticating xxxxxx: SERVER_DOWN({'result': -1, 'desc': "Can't contact LDAP server", 'ctrls': [], 'info': 'error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed (unable to get local issuer certificate)'})
正式问询:Django会在哪些路径下查找可信证书?
回答
Django本身没有单独维护可信证书路径,它依赖django-auth-ldap底层的python-ldap库,而该库使用OpenSSL的证书存储机制,默认查找路径如下:
- Linux系统:通常为
/etc/ssl/certs/目录,部分发行版(如RHEL/CentOS)会使用/etc/pki/tls/certs/;也会读取/etc/ssl/cert.pem或/etc/pki/tls/cert.pem这类合并证书文件。 - Windows系统:直接调用系统证书存储(Windows Certificate Store)中的可信根证书。
- macOS系统:默认读取
/usr/local/etc/openssl/certs/,或系统钥匙串(Keychain Access)内的可信证书。
从你的错误日志来看,核心问题是本地缺少LDAP服务器证书的颁发机构证书,导致验证失败。可以通过以下方式解决:
- 指定自定义证书路径:在
settings.py中配置全局LDAP选项,强制指定CA证书文件路径:
import ldap AUTH_LDAP_GLOBAL_OPTIONS = { ldap.OPT_X_TLS_CACERTFILE: "/path/to/your/ca-certificate.pem", ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_DEMAND, }
将/path/to/your/ca-certificate.pem替换为LDAP服务器CA证书的实际路径。
2. 测试环境临时跳过验证:仅用于测试场景,生产环境禁止使用:
import ldap AUTH_LDAP_GLOBAL_OPTIONS = { ldap.OPT_X_TLS_REQUIRE_CERT: ldap.OPT_X_TLS_NEVER, }
另外注意你的AUTH_LDAP_USER_SEARCH中DN的格式问题:OU=SF_SAP, DC=sf里逗号后多了空格,应改为OU=SF_SAP,DC=sf,避免DN解析错误。
内容的提问来源于stack exchange,提问作者Kethan Chauhan
相关产品推荐
相关产品推荐

