【问题标题】:Authenticating a self-signed certificate for LDAPS connection为 LDAPS 连接验证自签名证书
【发布时间】:2014-08-21 10:59:54
【问题描述】:

我想建立一个从 Linux(Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux) 客户端到 Windows 2012 服务器的安全 ldap 连接 (ldaps),以更改用户活动目录中的密码,通过 php。 为此,我在服务器上创建了一个自签名证书(使用 Windows 服务器管理器),但是当我尝试连接时,我收到以下错误(通过打开调试选项: ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);):

ldap_create                                                                 
ldap_url_parse_ext(ldaps://xxx.xxx.xxx.xxx)                                 
ldap_bind_s                                                                 
ldap_simple_bind_s                                                          
ldap_sasl_bind_s                                                            
ldap_sasl_bind                                                              
ldap_send_initial_request                                                   
ldap_new_connection 1 1 0                                                   
ldap_int_open_connection                                                    
ldap_connect_to_host: TCP xxx.xxx.xxx.xxx:636                               
ldap_new_socket: 3                                                          
ldap_prepare_socket: 3                                                      
ldap_connect_to_host: Trying xxx.xxx.xxx.xxx:636                            
ldap_pvt_connect: fd: 3 tm: -1 async: 0                                     
TLS: peer cert untrusted or revoked (0x42)                                  
TLS: can't connect: (unknown error code).                                   
ldap_err2string                                                             
PHP Warning:  ldap_bind(): Unable to bind to server 

似乎客户端无法信任证书,因为它是自签名的。

我应该采取哪些步骤来建立安全连接?客户端证书存储在/etc/ssl/certs/ca-certificates.crt

【问题讨论】:

  • 您需要信任服务器的证书并执行检查,还是只需要加密?你的 ldap.conf 文件的内容是什么?
  • 只需一行TLS_CACERT /etc/ssl/certs/ca-certificates.crt

标签: php active-directory ldap ssl-certificate client-certificates


【解决方案1】:

您必须明确告诉 LDAP 客户端忽略不受信任的证书。您可以通过将以下内容添加到您的 ldap.conf 文件来做到这一点:

TLS_REQCERT never

虽然这个解决方案不是首选的。您应该将所需的 CA 根添加到您的客户端,并确保正确生成证书,其中包含服务器名称(如果我没记错的话,完整的 CA 链),否则没有什么可以阻止某人执行 MITM 攻击。

【讨论】:

  • 如果您能帮助我弄清楚如何添加 CA 根并确保证书的正确性,我将非常高兴。
  • 我已经很多年没有这样做了,所以我不能真正帮助你详细的步骤,但是看看this entry on datacenteroverlords,它当时对我有帮助。确保阅读 cmets 以及他们足智多谋。
  • 谢谢你。嗯,再查询一次,ldap_mod_replace() 只对用户名有效一次,下一次,它返回一个错误说res_errno: 53, res_error: <0000052D: SvcErr: DSID-031A129B, problem 5003 (WILL_NOT_PERFORM), data 0
  • 要么您指定了一个不存在/受保护的属性,要么您更改了用户名 ||密码元组和您与 ldap 服务器的连接不再有效(在这种情况下,您需要启动一个新的)。
  • 解决了。我的新密码不符合条件。谢谢:)
【解决方案2】:

您的 LDAP 服务器正在使用自签名证书,因此,为了信任该证书,LDAP 客户端需要创建该证书的 CA 的证书。

  1. 将您的 CA 证书文件放入 /etc/ldap/certs/myca.pem(您可能需要 mkdir certs 目录)。
  2. 将带有TLS_CACERT /etc/ldap/certs/myca.pem 的新行添加到/etc/ldap/ldap.conf。 (您可能会看到与“/etc/ssl/certs/ca-certificates.crt”类似的行。)

    $ php -a
    Interactive mode enabled
    php > ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
    ...
    ldap_init: using /etc/ldap/ldap.conf
    ...
    php > $conn = ldap_connect("your_ldap_server");
    php > ldap_start_tls($conn);
    

如果不更改配置,您将看到PHP Warning: ldap_start_tls(): Unable to start TLS: Connect error in php shell code on line 1function documentation 的 cmets 提供进一步阅读,但每个人似乎都直接设置“TLS_REQCERT never”。工作!=安全。 demand 是默认设置,我会保留它(或明确设置)。 TLS_REQCERT 的文档是here。 (看起来,如果您确实设置了“从不”,但后面跟着“TLS_CACERT”行,它会忽略从不。呃。)

注意:我知道你使用了“ldaps://”和 ldap_bind(),但试试preferred ldap_start_tls()。

STARTTLS 是一种替代方法,现在是首选方法 对 LDAP 连接进行加密。

【讨论】:

    【解决方案3】:

    对于那些偶然发现这一点的人,PHP7.1 现在允许您通过ldap_set_option() 设置 CA 文件和 CA 目录,而不必更新服务器配置文件。

    在此处查看ldap_set_option 的文档,注意LDAP_OPT_X_TLS_ 选项:https://secure.php.net/manual/en/function.ldap-set-option.php

    一个警告:似乎可能存在一个错误,其中LDAP_OPT_X_TLS_CACERTFILE 仅在同时设置了LDAP_OPT_X_TLS_CACERTDIR 时才被接受,请参阅https://bugs.php.net/bug.php?id=73558。我还没有验证这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2019-04-24
      • 2015-11-01
      • 2012-09-08
      相关资源
      最近更新 更多