我想从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
答案 0 :(得分:5)
您必须明确告诉LDAP客户端忽略不受信任的证书。您可以通过在ldap.conf文件中添加以下内容来完成此操作:
TLS_REQCERT never
但这个解决方案并不是首选。您应该将所需的CA root添加到您的客户端,并确保使用服务器名称正确生成证书(如果我的内存为我提供完整的CA链),否则不会阻止某人执行MITM攻击。
答案 1 :(得分:4)
您的LDAP服务器正在使用自签名证书,因此,为了信任这一点,LDAP客户端需要为创建该证书的CA提供证书。
/etc/ldap/certs/myca.pem
中(您可能必须mkdir
证书目录。)使用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);
如果没有配置更改,您会看到PHP Warning: ldap_start_tls(): Unable to start TLS: Connect error in php shell code on line 1
。 function 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。我还没有验证。