如何在PHP中解决ldap_start_tls()"无法启动TLS:连接错误"?

use*_*094 14 php ssl certificate

我越来越:

警告:ldap_start_tls()[function.ldap-start-tls]:无法启动TLS:在Y行的/var/www/X.php中连接错误

/etc/ldap/ldap.conf:

TLS_CACERT     /etc/ssl/certs/ca.crt
Run Code Online (Sandbox Code Playgroud)

ca.crt是签署LDAP服务器证书的CA. LDAP服务器上的证书已过期,我无法更改它.

Jon*_*eig 28

您可以通过发出来忽略Windows中的有效性

putenv('LDAPTLS_REQCERT=never');
Run Code Online (Sandbox Code Playgroud)

在你的PHP代码中.在*nix中,您需要编辑/etc/ldap.conf要包含的内容

TLS_REQCERT never
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的是它需要版本3(版本2是php默认):

//$hostnameSSL example would be "ldaps://just.example.com:636" , just make sure it has ldaps://
$con = ldap_connect($hostnameSSL);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
Run Code Online (Sandbox Code Playgroud)

为了更好地了解正在发生的事情,您可以通过以下方式启用调试日志记录:

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
Run Code Online (Sandbox Code Playgroud)

这可以在ldap_connect发生之前完成.

  • 请注意,通过禁用证书验证,您可以通过允许中间人攻击来打开安全漏洞.您正在加密传输而不验证目的地! (5认同)
  • 这是一个可怕的答案。他应该解决问题而不是禁用检查。 (3认同)

小智 5

问题中提出的特定场景(证书已过期且无法更改)似乎确实需要在 LDAP 客户端上禁用证书验证。

但是,我怀疑很多人和我一样,访问此页面是为了了解接收不透明 LDAP TLS 错误的其他根本原因,其中禁用 TLS 证书验证并不是一个合适的答案。

就我而言 - 在 Ubuntu 18.04 LTS 服务器上使用 Mediawiki 的 LDAP 身份验证扩展,并根据 Windows Server 2012 服务器上的 Active Directory 进行身份验证 - 身份验证在 2020 年 1 月/2 月停止工作。服务器证书和 CA 证书仍然有效两者都有效,并且openssl s_client -verify 2 -connect <AD server>:636从 Mediawiki 服务器传递得很好。

最终我注意到 AD/LDAP 提供的 SSL 证书中的签名算法是 SHA1,我记得它最近遭受了第一个已知的选择前缀冲突漏洞利用这促使我调查了系统上最近更新的软件包的变更日志,大约在 2020 年 1 月 8 日的 gnutls28 变更日志中发现“将 SHA1 标记为证书签名不安全” 。(Ubuntu 18.04 中 php-ldap 包的依赖链转到 php7.2-ldap -> libldap-2.4-2 -> libgnutls30,其源包是 gnutls28。)

我按照一些说明更新 Windows CA 以使用 SHA256,然后有选择地按照说明更新 AD/LDAP 证书,在我的 Mediawiki 服务器上安装新的 CA 证书,问题就解决了!简而言之,这些步骤包括:

  1. 在 AD 服务器上的管理 PowerShell 中,运行certutil -setreg ca\csp\CNGHashAlgorithm SHA256
  2. 在证书颁发机构 MMC 中,右键单击 CA -> 所有任务 -> 续订 CA 证书
  3. 在空白 MMC 中,添加证书管理单元;选择本地计算机
  4. 在个人 -> 证书下,找到 LDAPS(Kerberos 身份验证模板类型)使用的当前条目 -> 所有任务 -> 高级选项 -> 使用相同密钥续订此证书
  5. 在同一窗口中,打开新的 CA 证书 -> 详细信息 -> 复制到文件 -> 无私钥 -> base64 编码的 X.509
  6. 将生成的文件复制到 Mediawiki 服务器上的 /usr/share/ca-certificates/,然后运行sudo dpkg-reconfigure ca-certificates并选择要包含的新 CA 证书。



PS 出于 SEO 目的,根据我使用的模式,错误消息包括:

  • ldap_start_tls(): Unable to start TLS: Connect error in /var/www/mediawiki/extensions/LdapAuthentication/LdapAuthenticationPlugin.php在 HTTP 错误日志中
  • ldap_start_tls(): Unable to start TLS: Can't contact LDAP server in [...]
  • Failed to start TLS.在 Mediawiki 调试日志中(当使用wgLDAPEncryptionType=时ssl,即加密的 LDAP 端口 636)
  • Failed to bind as CN=foobar,CN=Users,DC=myOrgName,DC=local在 Mediwiki 调试日志中(当使用wgLDAPEncryptionType=时tls,即未加密的 LDAP 端口 389 上的 STARTTLS)