关于这个问题已经有很多文章,但都不是我的问题。问题是无论我做什么,我都无法让 openldap 工具(或使用 openldap 的 PHP)接受由主域控制器 CA 签名的证书。但是,它是有效,如 openssl 所示。
在 Windows 网络中,所有加入域的 PC 都信任域控制器的 CA 证书。我在 Ubuntu 中模仿了这一点:
cp -v /tmp/PDC02CA.crt /usr/local/share/ca-certificates
update-ca-certificates
OpenSSL 批准了这一点(但除此之外它并不喜欢它):
# openssl verify -verify_hostname PDC01.city.cmpny.local /tmp/PDC01.city.cmpny.local.crt
/tmp/PDC01.city.cmpny.local.crt: OK
但ldapsearch
就是不会批准:
$ ldapsearch -d1 -H ldaps://ldap.city.cmpny.local:3269/
ldap_url_parse_ext(ldaps://ldap.city.cmpny.local:3269/)
ldap_create
ldap_url_parse_ext(ldaps://ldap.city.cmpny.local:3269/??base)
ldap_pvt_sasl_getmech
ldap_search
put_filter: "(objectclass=*)"
put_filter: simple
put_simple_filter: "objectclass=*"
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP ldap.city.cmpny.local:3269
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 10.220.10.10:3269
ldap_pvt_connect: fd: 3 tm: -1 async: 0
attempting to connect:
connect success
TLS: peer cert untrusted or revoked (0x102)
TLS: can't connect: (unknown error code).
ldap_msgfree
ldap_err2string
ldap_sasl_interactive_bind_s: Can't contact LDAP server (-1)
additional info: (unknown error code)
我尝试了所有可以在线找到的方法,比如设置LDAPTLS_CACERT=/etc/ssl/certs/ca-certificates.crt
、使用 进行编辑/etc/ldap/ldap.conf
等TLS_CACERT
。只有设置TLS_REQCERT never
有效,但我当然不想要那样。
当我设置时TLS_CACERTDIR
,ldapsearch
显示:“TLS:警告:cacertdir 未为 gnutls 实现”
一些验证有效。如果我这样做ldapsearch -d1 -H ldaps://www.google.com:443/
,那就没问题了(除了它不是 LDAP 这一事实)。
我怀疑这是 OpenSSL 和 GnuTLS 验证方式的差异,但据我所知,GnuTLS 根本就不会查看/etc/ssl/certs/ca-certificates.crt
。并strace
证明了这一点:
openat(AT_FDCWD, "/etc/ssl/certs/ca-certificates.crt", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=201737, ...}) = 0
lseek(4, 0, SEEK_CUR) = 0
mmap(NULL, 204800, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe84e7e3000
fstat(4, {st_mode=S_IFREG|0644, st_size=201737, ...}) = 0
read(4, "-----BEGIN CERTIFICATE-----\nMIIH"..., 200704) = 200704
read(4, "swGQYDVQQDExJBbG1lcmUtVklD\nUERDM"..., 4096) = 1033
read(4, "", 4096) = 0
close(4)
它显示它有 201737 个字节,并分两次读取,首先读取 200704 个字节,然后读取 1033 个字节。
设置LDAPTLS_CACERT=/usr/local/share/ca-certificates/PDC02CA.crt
,strace
显示它改为读取该内容。仍然不起作用。
编辑:我刚刚注意到证书的主题为空,所以没有CN
(通用名称)。它只有一个X509v3 Subject Alternative Name
。嗯,可能是这样。需要做一些工作来测试。