我对 ldap 与 SSL/TLS 配合使用感到头疼。我可以确认服务器正在监听并在端口 636 上响应 SSL 请求。openssl s_client -connect freia.fqdn:636 -showcerts
产生预期的输出,gnutls-cli-debug -p636 localhost
产生这。由于 ubuntu 存储库中的版本存在一些错误配置,无法完成安装,因此服务器已从源代码构建。服务器正在使用命令运行slapd -d -1 -h 'ldap:/// ldaps:///'
截取的启动日志这里.ldapsearch -H ldap:///
也产生预期的输出。
ldapsearch -H ldaps:///
返回
ldap_sasl_interactive_bind_s: Can't contact LDAP server (-1)
ldapsearch -Z -H ldaps:///
返回
ldap_start_tls: Can't contact LDAP server (-1)
ldap_sasl_interactive_bind_s: Can't contact LDAP server (-1)
服务器日志显示:
TLS trace: SSL_accept:before/accept initialization
tls_read: want=11, got=0
TLS: can't accept: (unknown)
由于没有发送任何内容,我检查了 ldapsearch 实际发送的内容。它说找不到 pem 文件
TLS: could not load verify locations (file:`/etc/ssl/private/freia_slapd_key.pem',dir:`').
根据以下说法,这完全是胡说八道strace ldapsearch -Z -H ldaps:/// -d -1
:
open("/etc/ssl/private/freia_slapd_key.pem", O_RDONLY|O_LARGEFILE) = 4
fstat64(4, {st_mode=S_IFREG|0440, st_size=883, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb770b000
read(4, "-----BEGIN RSA PRIVATE KEY-----\n"..., 4096) = 883
read(4, "", 4096) = 0
close(4) = 0
munmap(0xb770b000, 4096) = 0
write(2, "TLS: could not load verify locat"..., 91TLS: could not load verify locations (file:`/etc/ssl/private/freia_slapd_key.pem',dir:`').
所有证书都是可读的(或应该是)
-rw-r--r-- 1 root root 1082 2011-12-26 16:50 /etc/ssl/certs/cacert.pem
-rw-r--r-- 1 root root 1013 2011-12-26 16:51 /etc/ssl/certs/freia_slapd_cert.pem
-r--r----- 1 root root 883 2011-12-26 16:50 /etc/ssl/private/freia_slapd_key.pem
答案1
问题出在 ldap.conf 中:
TLS_CACERT /etc/ssl/private/freia_slapd_key.pem
您使用私人钥匙你应该使用根证书。一般情况下,用正确的 CA 证书替换它 - ldapsearch 可以用作受信任的“根”的证书来确认它在途中遇到的所有其他(“不受信任的”)证书。
如果您的 /etc/ssl/certs/freia_slapd_证书.pem(不是 /etc/ssl/private/freia_slapd_钥匙.pem) 是自签名的,这意味着它是自己的根,您可以/应该将其用作 TLS_CACERT。但这意味着它永远不会被公众信任,公众会使用已知的“根”(如 Verisign 等 CA)。
顺便说一句,TLS_KEY 和 TLS_CERT 在系统范围的 ldap.conf 中被忽略(理所当然)。请参阅http://manpages.ubuntu.com/manpages/natty/man5/ldap.conf.5.html