微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 ldaps

如何解决通过 ldaps

我已经安装了一个 ApacheDS(Apache 目录)并且正在尝试通过 ldaps 连接它。 我能够通过 ldap(端口 10389)成功对其进行身份验证,但在尝试通过 ldap 使其工作时出现以下错误

Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 445,in simple_bind_s
    msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
  File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 439,in simple_bind
    return self._ldap_call(self._l.simple_bind,who,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls))
  File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 331,in _ldap_call
    reraise(exc_type,exc_value,exc_traceback)
  File "/usr/local/lib/python3.6/dist-packages/ldap/compat.py",line 44,in reraise
    raise exc_value
  File "/usr/local/lib/python3.6/dist-packages/ldap/ldapobject.py",line 315,in _ldap_call
    result = func(*args,**kwargs)
ldap.SERVER_DOWN: {'desc': "Can't contact LDAP server",'errno': 2,'info': '(unkNown error code)'}
>>>

我了解这是由于证书验证。

用于身份验证的代码是:

import ldap
import os
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_DEMAND)
ls = ldap.initialize('ldaps://10.120.213.106:10636',trace_level=2)
ls.set_option(ldap.OPT_REFERRALS,0)
ls.set_option(ldap.OPT_PROTOCOL_VERSION,3)
ls.set_option(ldap.OPT_X_TLS,ldap.OPT_X_TLS_DEMAND)
ls.set_option(ldap.OPT_X_TLS_DEMAND,True)
ls.set_option(ldap.OPT_DEBUG_LEVEL,4095)
ls.set_option(ldap.OPT_X_TLS_CACERTFILE,"/tmp/server.cer")
ls.simple_bind_s('uid=admin,ou=system','secret')

我无法找到 ApacheDS 认提供的自签名证书,所以我使用

创建了一个证书和一个密钥库
keytool -genkey -keyalg "RSA" -dname "cn=hax,ou=some,dc=com,o=ASF,c=US" -alias hax -keystore hax.ks -storepass secret -validity 730

然后使用以下方法在受信任的密钥库中导出证书:

keytool -export -keystore hax.ks -alias hax -file hax.cer
keytool -import -file hax.cer -alias hax -keystore trusted.ks -storepass secret

将 apacheDS 配置为使用 hax.ks 作为密钥并重新启动它。 我也试过 ls.set_option(ldap.OPT_X_TLS_CACERTFILE,"/tmp/trusted.ks") 但没有成功。

在这里错过了什么? 注意:我可以通过将 ldap.OPT_X_TLS_REQUIRE_CERT 设置为允许或从不进行连接。但我不想这样做,而是要验证证书。

解决方法

对于连接到测试或开发服务器的脚本,我总是使用

ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)

另外,建议使用StartTLS扩展,所以连接到明文端口(389或10389)然后发出

conn.start_tls_s()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。