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 demosの 1 つで行われます。

于 2014-12-30T22:13:33.737 に答える