php - 无法通过 SSL 在 php 中针对 Active Directory LDAP 绑定?
问题描述
我们有一个 IIS php 站点,它使用 LDAP 对 Active Directory 进行身份验证,特别是使用 ldap_connect 和 ldap_bind。这工作正常,但我们正在为等待更改做准备,只允许签名的 LDAP 绑定到 AD。当我将代码更新为我认为应该工作的代码时,我会遇到身份验证失败,但我无法获取实际的错误代码来帮助进行故障排除。
截至目前,我们的域控制器上禁用了 TLS 绑定,我只想使用 636 上的 AD SSL 绑定(而不是 389 上的 TLS)。我们在 Server 2008 R2 服务器上的 IIS 6.1 上使用 PHP 5.6.30...我们构建了迁移目标,即 IIS 10 和 PHP 7.2 上的 Server 2016,我们看到了相同的结果。php_openssl 和 php_ldap 是启用的扩展。
这是当前代码:
$this->AD_SERVER = $config['AD_SERVER'];
assert(is_string($password));
if ($password == "") {
throw new \SimpleSAML\Error\Error('NOPASSWORD');
}
$ldap = ldap_connect($this->AD_SERVER);
$ldaprdn = 'DOMAINPREFIX' . "\\" . $user;
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = @ldap_bind($ldap, $ldaprdn, $password);
这工作正常。在此之后,使用“ldap_search”和“ldap_get_entries”拉取属性是成功的。用户名和密码由尝试验证的用户提供;绑定发生在身份验证用户的凭据下。
如果我将第一行更改为以下内容,我只会遇到身份验证失败,不再有描述性错误:
$this->AD_SERVER = 'ldaps://'.$config['AD_SERVER'].':636';
assert(is_string($password));
if ($password == "") {
throw new \SimpleSAML\Error\Error('NOPASSWORD');
}
$ldap = ldap_connect($this->AD_SERVER);
$ldaprdn = 'DOMAINPREFIX' . "\\" . $user;
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = @ldap_bind($ldap, $ldaprdn, $password);
我已经搞砸了“LDAP_OPT_X_TLS_REQUIRE_CERT”并禁用了其他 tls 东西,但这没关系(而且我认为它不会)。
在域控制器上,对于失败的尝试,我根本看不到 2280-2290 的 eventID(我相信这会暴露绑定错误)。此外,当配置不安全绑定时,我只看到 4776(身份验证尝试),当安全绑定失败时,我根本没有尝试过。我相信存在绑定问题,但是我似乎无法公开任何日志来帮助诊断它。
我发现很多文章说明了如何为 openldap 执行此操作,但是我几乎没有发现任何记录 AD LDAP 签名绑定的内容。我看到很多人表示我们应该切换到 TLS,因为 636 上的 SSL 绑定是非标准的 LDAP 事物,仅适用于 AD,但我们真的希望尽可能避免这种情况。任何援助将不胜感激。
解决方案
在这篇博文中找到了答案:https ://ashleyknowles.net/2011/07/iis-php-and-ldaps-with-active-directory/
以 Base64 X.509 格式导出根 CA
创建 C:\OpenLDAP\sysconf\ 目录树(不要安装 OpenLDAP,只创建文件夹)
将根 CA 证书复制到网络服务器 (C:\OpenLDAP\sysconf\webcert.crt)
使用以下行创建 C:\OpenLDAP\sysconf\ldap.conf:
TLS_REQCERT 从不
TLS_CACERT c:\openldap\sysconf\webcert.crt
使用 ldap_connect(“ldaps://servername//”) 连接
推荐阅读
- javascript - 关于 Array.reduce() 的奇怪函数
- assembly - 组装错误的memmove执行?
- reactjs - 为什么对 Ref 对象的更改会在此代码中触发重新呈现
- python - websocket错误处理WebSocket'对象没有属性'ws' Python
- javascript - 如何使用 Firebase 进行排名?
- c# - Stripe SCA 迁移中的收据 URL
- r - DBSCAN:可变集群大小
- javascript - 从 <:Emoji_name:ID> 获取表情符号名称
- r - R中的2个比例假设检验
- django - django stripe create charge