3

我在控制台中使用 python ldap 得到了我无法解释的结果。希望有人可以为我澄清这一点。

打开新的python控制台

import ldap

certfile = '~/ad-server.test.loc.pem'
ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, certfile)

who = 'CN=Administrator,CN=Users,dc=test,dc=loc'
passwd = 'passwd'
sslserver = 'ldaps://ad-server.test.loc:636'

#let's say I would like to disable certificate verification for the next connection
ldap.set_option(ldap.OPT_X_TLS_REQUIRECERT, ldap.OPT_X_TLS_ALLOW)
conn = ldap.initialize(server)
conn.simple_bind_s(who, passwd)

(97, [])

#connected successfully

#Now I want to enable certificate verification and try to connect again (this time I should
#fail because I use sef-signed certificate)

#Unbind connection

conn.unbind()
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_DEMAND)
conn = ldap.initialize(server)

#Trying to connect

conn.simple_bind_s(who, passwd)

(97, [])


# it is also connected succesfully. Why?

这是一个问题,我打开了证书验证,所以它应该以错误完成连接尝试,但连接成功(我使用了自签名证书,这就是为什么尝试连接失败)?

另一个例子。做同样的事情,但顺序不同

打开新的python控制台

import ldap

certfile = '~/ad-server.test.loc.pem'
ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, certfile)
who = 'CN=Administrator,CN=Users,dc=test,dc=loc'
passwd = 'passwd'
sslserver = 'ldaps://ad-server.test.loc:636'

#Trying to connect using selfsigned certificate

ldap.set_option(ldap.OPT_X_TLS_REQUIRECERT, ldap.OPT_X_TLS_DEMAND)
conn = ldap.initialize(server)
conn.simple_bind_s(who, passwd)
Traceback bla bla bla
ldap.SERVER_DOWN: {'info': 'error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed', 'desc': "Can't contact LDAP server"}

#Ok, let's disable verefication and try again
conn.unbind()
ldap.set_option(ldap.OPT_X_TLS_REQUIRECERT, ldap.OPT_X_TLS_ALLOW)
conn = ldap.initialize(server)
conn.simple_bind_s(who, passwd)
Traceback bla bla bla
ldap.SERVER_DOWN: {'info': 'error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed', 'desc': "Can't contact LDAP server"}


# Even if I disabled verefication connection failed. Why? I expected a positive result.

有人可以解释一下吗?

4

1 回答 1

4

我们刚刚遇到了类似的问题。基本上,所有的 TLS 选项都是默认全局设置的,并存储在 GNUTLS 使用的上下文对象中。第一次创建连接时,它将成为该过程中所有后续连接将使用的 TLS 上下文。

要更改此行为,您进行的最后一次与 TLS 相关的set_option调用应该是:

connection.set_option(ldap.OPT_X_TLS_NEWCTX, 0)

这实际上是在其中一个python-ldap 演示中完成的。

于 2014-12-30T22:13:33.737 回答