验证LDAPS连接的自签名证书

时间:2014-08-21 10:59:55

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

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

3 个答案:

答案 0 :(得分:5)

您必须明确告诉LDAP客户端忽略不受信任的证书。您可以通过在ldap.conf文件中添加以下内容来完成此操作:

TLS_REQCERT never

但这个解决方案并不是首选。您应该将所需的CA root添加到您的客户端,并确保使用服务器名称正确生成证书(如果我的内存为我提供完整的CA链),否则不会阻止某人执行MITM攻击。

答案 1 :(得分:4)

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

  1. 将您的CA证书文件放在/etc/ldap/certs/myca.pem中(您可能必须mkdir证书目录。)
  2. 使用TLS_CACERT /etc/ldap/certs/myca.pem/etc/ldap/ldap.conf添加新行。 (您可能会看到与&#34相似的行; /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);
    
  3. 如果没有配置更改,您会看到PHP Warning: ldap_start_tls(): Unable to start TLS: Connect error in php shell code on line 1function documentation的评论提供了进一步的阅读,但每个人似乎都直接设置" TLS_REQCERT从不"。工作!=安全。 demand是默认设置,我将其保留(或明确设置)。 TLS_REQCERT上的文档是here。 (似乎如果你设置"从不"但是跟随后来" TLS_CACERT"行,它会忽略永远。呃。)

    注意:我知道你用过" ldaps://"和ldap_bind(),但试试preferred ldap_start_tls()。

      

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

答案 2 :(得分:2)

对于那些偶然发现问题的人,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。我还没有验证。