sách gpt4 ai đã đi

openssl - 使用 .start_tls_s() 时如何强制 Python LDAP 验证/验证 SSL 证书

In lại 作者:行者123 更新时间:2023-12-02 12:29:51 30 4
mua khóa gpt4 Nike

我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下

我想在调用 .start_tls_s() 后验证与给定 LDAP 服务器的连接(或者在无法验证证书时引发该方法并引发异常)。 (我还想检查 CRL,但那是另一回事)。

Đây là mã của tôi:

#!python
#!/usr/bin/env python
import ConfigParser, os, sys
import ldap

CACERTFILE='./ca_ldap.bad'
## CACERTFILE='./ca_ldap.crt'

config = ConfigParser.ConfigParser()
config.read(os.path.expanduser('~/.ssh/creds.ini'))
uid = config.get('LDAP', 'uid')
pwd = config.get('LDAP', 'pwd')
svr = config.get('LDAP', 'svr')
bdn = config.get('LDAP', 'bdn')

ld = ldap.initialize(svr)
ld.protocol_version=ldap.VERSION3
ld.set_option(ldap.OPT_DEBUG_LEVEL, 255 )
ld.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
ld.set_option(ldap.OPT_X_TLS_CACERTFILE, CACERTFILE)
ld.set_option(ldap.OPT_X_TLS_DEMAND, True )
ld.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_HARD)

## From: https://stackoverflow.com/a/7810308/149076
## and : http://python-ldap.cvs.sourceforge.net/viewvc/python-ldap/python-ldap/Demo/initialize.py?revision=1.14&view=markup

ld.start_tls_s()

for each in dir(ldap):
if 'OPT_X_TLS' in each:
thử:
print '\t*** %s: %s' % (each, ld.get_option((getattr(ldap, each))))
ngoại trừ Ngoại lệ, e:
print >> sys.stderr, '... Except %s: %s\n' % (each, e)

ld.simple_bind_s(uid, pwd)
results = ld.search_s(bdn, ldap.SCOPE_SUBTREE)

print 'Found %s entries under %s' % (len(results), bdn)
sys.exit()

正如评论中所指出的,我已经从https://stackoverflow.com/a/7810308/149076复制了大部分内容。和来自 http://python-ldap.cvs.sourceforge.net/viewvc/python-ldap/python-ldap/Demo/initialize.py?revision=1.14&view=markup ...尽管我已经尝试了许多变体和序列。

如图所示,我有两个文件,分别代表一个证书和一个应该可以工作的文件(它实际上取 self 们的一个系统,该系统配置为运行sssd(系统安全服务守护进程),其中假定检查正确。

在“坏”副本中,我只是将每个 key 行的第一个字符替换为字母“x”,假设这会损坏 CA key 并导致任何尝试验证签名链的代码失败.

但是,Python LDAP 代码似乎忽略了这一点;即使我将其设置为 /dev/null 或完全虚假的路径,我的代码仍然运行,仍然绑定(bind)到 LDAP 服务器,并且仍然完成我的搜索请求。

所以问题是,如何让它按预期“失败”(或者更广泛地说,如何防止我的代码容易受到 MITM (Mallory) 攻击?

如果它对本次讨论有任何影响,这里是我的 OpenSSL 版本:

$ openssl version
OpenSSL 0.9.8za 5 Jun 2014

LDAP 服务器正在运行 OpenLDAP,但我不知道有关其版本或配置的任何详细信息。

这是我的代码的示例输出:

    *** OPT_X_TLS: 0
*** OPT_X_TLS_ALLOW: 0
*** OPT_X_TLS_CACERTDIR: None
*** OPT_X_TLS_CACERTFILE: /bogus/null
*** OPT_X_TLS_CERTFILE: None
*** OPT_X_TLS_CIPHER_SUITE: None
*** OPT_X_TLS_CRLCHECK: 0
*** OPT_X_TLS_CRLFILE: None
*** OPT_X_TLS_CRL_ALL: 1
*** OPT_X_TLS_CRL_NONE: {'info_version': 1, 'extensions': ('X_OPENLDAP', 'THREAD_SAFE', 'SESSION_THREAD_SAFE', 'OPERATION_THREAD_SAFE', 'X_OPENLDAP_THREAD_SAFE'), 'vendor_version': 20428, 'protocol_version': 3, 'vendor_name': 'OpenLDAP', 'api_version': 3001}
*** OPT_X_TLS_CRL_PEER: 3
... Except OPT_X_TLS_CTX: unknown option 24577

*** OPT_X_TLS_DEMAND: 1
*** OPT_X_TLS_DHFILE: None
*** OPT_X_TLS_HARD: 3
*** OPT_X_TLS_KEYFILE: None
*** OPT_X_TLS_NEVER: {'info_version': 1, 'extensions': ('X_OPENLDAP', 'THREAD_SAFE', 'SESSION_THREAD_SAFE', 'OPERATION_THREAD_SAFE', 'X_OPENLDAP_THREAD_SAFE'), 'vendor_version': 20428, 'protocol_version': 3, 'vendor_name': 'OpenLDAP', 'api_version': 3001}
... Except OPT_X_TLS_NEWCTX: unknown option 24591

*** OPT_X_TLS_PACKAGE: OpenSSL
*** OPT_X_TLS_PROTOCOL_MIN: 0
*** OPT_X_TLS_RANDOM_FILE: None
*** OPT_X_TLS_REQUIRE_CERT: 1
*** OPT_X_TLS_TRY: 0

Found 883 entries under [... redacted ...]

1 Câu trả lời

您的代码按预期对我有用。实际上,当我第一次执行你的代码时,我遇到了完全相反的问题。它luôn luôn说“证书验证失败”。添加以下行修复了此问题:

# Force libldap to create a new SSL context (must be last TLS option!)
ld.set_option(ldap.OPT_X_TLS_NEWCTX, 0)

现在,当我使用错误的 CA 证书或已按照您的描述进行修改的证书时,结果是以下错误消息:

Theo dõi (cuộc gọi gần đây nhất là cuộc gọi cuối cùng):
File "ldap_ssl.py", line 28, in
ld.start_tls_s()
File "/Library/Python/2.7/site-packages/python_ldap-2.4.19-py2.7-macosx-10.10-intel.egg/ldap/ldapobject.py", line 571, in start_tls_s
return self._ldap_call(self._l.start_tls_s)
File "/Library/Python/2.7/site-packages/python_ldap-2.4.19-py2.7-macosx-10.10-intel.egg/ldap/ldapobject.py", line 106, in _ldap_call
result = func(*args,**kwargs)
ldap.CONNECT_ERROR: {'info': 'error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (unable to get local issuer certificate)', 'desc': 'Connect error'}

当我使用正确的 CA 证书时,输出与您的类似。

<小时>

现在有趣的问题是:我们的设置之间有什么差异,特别是哪些差异导致您的计算机上出现这种奇怪的行为?

我的设置是:

  • Mac OS X 10.10
  • Python 2.7.6
  • python-ldap 2.4.19(手动安装)
  • OpenLDAP 2.4.39(通过 Homebrew)
  • OpenSSL 1.0.1l(通过 Homebrew)

我有一个正在运行的本地 OpenLDAP,与 Homebrew 一起安装:

brew install homebrew/dupes/openldap --with-berkeley-db

在 Yosemite 上,使用 pip 安装时,python-ldap 有很多 bug(请参阅 Python-ldap set_option not working on Yosemite ),因此我必须下载 tarball 并编译/安装它,幸运的是,这非常简单,因为我已经使用当前版本安装了 OpenLDAP库/ header :

首先编辑 setup.cfg 中的 [_ldap] 部分,如下所示:

[_ldap]
library_dirs = /usr/local/opt/openldap/lib /usr/lib /usr/local/lib
include_dirs = /usr/local/opt/openldap/include /usr/include/sasl /usr/include /usr/local/include
extra_compile_args = -g -arch x86_64
extra_objects =
libs = ldap_r lber sasl2 ssl crypto

Mac OS SDK中有一些头文件,将目录(根据你的版本更改路径)链接到/usr/include:

sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/ /usr/include

然后构建并安装:

python setup.py build
sudo python setup.py install

otool 的输出显示 python-ldap 现在已链接到 OpenLDAP 2.4.39 和 OpenSSL 0.9.8 的库:

$ otool -L /Library/Python/2.7/site-packages/python_ldap-2.4.19-py2.7-macosx-10.10-intel.egg/_ldap.so
/Library/Python/2.7/site-packages/python_ldap-2.4.19-py2.7-macosx-10.10-intel.egg/_ldap.so:
/usr/local/lib/libldap_r-2.4.2.dylib (compatibility version 13.0.0, current version 13.2.0)
/usr/local/lib/liblber-2.4.2.dylib (compatibility version 13.0.0, current version 13.2.0)
/usr/lib/libsasl2.2.dylib (compatibility version 3.0.0, current version 3.15.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

构建 python-ldap 的另一种方法是仅安装构建所需的 OpenLDAP 库和 header : http://projects.skurfer.com/posts/2011/python_ldap_lion/

所有这些步骤也应该在 Mavericks 下工作,我认为使用最新的 OpenLDAP 和 OpenSSL 库将解决您的问题。

关于openssl - 使用 .start_tls_s() 时如何强制 Python LDAP 验证/验证 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29528794/

30 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com