- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试使用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 证书时,输出与您的类似。
<小时>小时>现在有趣的问题是:我们的设置之间有什么差异,特别是哪些差异导致您的计算机上出现这种奇怪的行为?
我的设置是:
我有一个正在运行的本地 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/
我们正在构建一个新的库,它需要对我们的主要身份管理 LDAP 系统进行读/写。 我们正在考虑使用 Spring LDAP ( http://projects.spring.io/spring-ldap
在 LDAP 身份验证的情况下, 是什么?参数 一般用于身份验证 .我想对于通过 ldap 登录的用户来说,使用 DN 会很头疼,因为它太大而无法记住。 使用 uid 或 sAMAccountName
我知道 LDAP 用于提供一些信息并帮助促进授权。 但是 LDAP 的其他用途是什么? 最佳答案 我将重点讨论为什么使用 LDAP,而不是 LDAP 是什么。 使用模型类似于人们使用借书卡或电话簿的方
我正在尝试查询 LDAP 服务器以获取使用 ruby 的 net-ldap 库的任何组的详细信息 require 'rubygems' require 'net/ldap' username =
在使用 spring ldap 模板的 Ldap 搜索中,我返回一个 User 对象,该对象具有保存另一个用户的 dn 的属性之一。并且,User 对象有一些属性需要使用其他用户的 ldap 条目获取
我正在尝试使用例如search_s函数根据对象的完整可分辨名称搜索对象,但我觉得这并不方便。例如, search_s('DC=example, DC=com', ldap.SCOPE_SUBTREE,
LDAP 查询如何工作:-(我)。 Windows Powershell(二). Java JNDI(三)。 SpringLDAP 上述 3 种方法中的 LDAP 筛选器查询是否仅搜索前 1000 条
我们正在使用 spring security 在我们的应用程序中对来自 LDAP 的用户进行身份验证。认证部分工作正常,但授权部分不工作。 我们无法从 LDAP 中检索用户的角色。 来自本书 《 Sp
这个问题在这里已经有了答案: Does the LDAP protocol limit the length of a DN (3 个回答) 关闭8年前。 DN 是否有最大长度?如果我想将它们存储在数
我知道我的谷歌搜索技能让我失望了,因为那里有 必须是这样的:一个简单、易于使用的远程托管目录服务(更好的是,通过几个不同的接口(interface)和 SSO 公开用户目录)。 你知道一个和/或有一个
我有一个使用 JSF 2.1 和 JEE 6 设置的 Web 应用程序,该应用程序在 WebLogic 12.1.2 服务器上运行,并带有用于身份验证的 openLDAP。我一直注意到在应用程序中加载
我的应用程序每天执行一次 LDAP 查询并获取给定容器中的所有用户和组。获取后,我的应用程序将遍历组的用户列表,仅将新用户添加到我的应用程序数据库中(它仅添加用户名)。 如果有 50,000 个用户,
我正在尝试解决一个问题,即尝试通过 LDAP 设置用户密码失败,因为访问被拒绝错误 - 即使我正在使用管理员用户对 AD 进行身份验证。 在 stackoverflow 中找到的答案说,要么我必须以管
我有一个我没有完全权限的 LDAP 服务器和一个我是 root 的具有 LDAP 身份验证的 ubuntu 系统。是否可以将 LDAP 用户添加到本地组? (我不知道我的表述是否正确,但我想要的只是在
我有一个属性(groupIDNumber),我想让它作为自动递增数字工作? 我们如何定义该属性? 感谢您的帮助, -纳米 最佳答案 这不是 LDAP 协议(protocol)的一部分,也不是标准的做法
对“uid”属性执行不区分大小写匹配的语法是什么?如果属性定义很重要,那么它将如何更改?特别是我将 ApacheDS 用于我的 LDAP 存储。 最佳答案 (uid=miXedCaseUSer)将匹配
Hoàn thành. Câu hỏi này đang tìm kiếm các đề xuất về sách, công cụ, thư viện phần mềm, v.v. Nó không đáp ứng được các hướng dẫn của Stack Overflow. Hiện tại không chấp nhận câu trả lời. Chúng tôi không chấp nhận những câu hỏi tìm kiếm lời khuyên về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi của mình để
我需要有关 LDAP 搜索过滤器的信息来提取嵌套组成员资格。基本上,我的想法是,例如,一个用户属于 5 个组 [A、B、C、D、E]我可以编写单个 LDAP 搜索查询来获取组 [A、B、C、D、E]
我关注了 installing ldap on centos 在我的服务器上设置 LDAP 服务器的指南,完成所有安装步骤后,我执行了 ldapsearch -x -b "dc=test,dc=com
我想编写一个 LDAP 查询来测试用户 (sAMAccountName) 是否是特定组的成员。是否可以这样做以便我获得 0 或 1 个结果记录? 我想我可以获取用户的所有组并测试每个组是否匹配,但我想
Tôi là một lập trình viên xuất sắc, rất giỏi!