我已经运行了几个月的 openLDAP 服务器,我们使用它来对许多应用程序进行身份验证。以前的工作人员设置了服务器,它似乎不是标准安装,但它非常简单。
最近我们的一个 CA 证书过期了,我们决定用 Let's Encrypt 替换它。我的经理更换了服务器上的证书。
它适用于 Web 应用程序(LDAP 管理器、自助服务密码更改),但是没有客户端可以针对它进行身份验证。例如,如果我尝试测试 Redmine LDAP 配置,我会收到一条消息“无法连接(SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A)”
针对它测试 Nexus 身份验证只是无法连接。
令人沮丧的是,LDAP 服务器或应用程序的日志中没有任何内容表明失败的原因。我的调查使我相信这是如何配置证书/密钥的事情,但我已经尝试了我能想到的所有东西以及我可以在网上找到的所有东西,但没有任何效果。
环境细节是:
Debian 8 openLDAP openldap-2.4.40
我的配置如下:
/etc/ldap/ldap.conf
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS certificates (needed for GnuTLS)
TLS_CACERT /etc/letsencrypt/live/myserver.com/fullchain.pem
/etc/ldap/slapd.d/cn=config.ldif
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal
entryUUID: c6dd9e40-9dc2-1035-8c03-add74f928a5e
creatorsName: cn=config
createTimestamp: 20160423171552Z
entryCSN: 20160423171552.629347Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20160423171552Z
如果我测试连接:
admin@ldap:~$ sudo openssl s_client -connect localhost:636 -showcerts -state -CAfile /etc/letsencrypt/live/myserver.com/fullchain.pem
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
140394818631312:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
有谁知道我错过了什么?
编辑
根据@84104 的建议,我将 tls.ldif 文件编辑为如下所示:
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/letsencrypt/live/myserver/fullchain.pem
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/letsencrypt/live/myserver/cert.pem
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/letsencrypt/live/myserver/privkey.pem
然后运行命令:
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
但是我现在得到的输出是:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Other (e.g., implementation specific) error (80)
我发现这可能是由于证书或密钥文件的权限造成的,但我将它们更改为与以前使用的文件上的完全匹配,但仍然收到此消息。
我再次为我缺乏对该主题的一般知识而道歉,但任何人都可以提出其他建议吗?
编辑
根据建议,我更改了 tls.ldif 并将所有命令从替换更改为删除,然后再次运行 ldapmodify 命令。还有另一个错误。
admin@ldap:/etc/ansible_ldif_work$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.remove.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
ldap_modify: Inappropriate matching (18)
additional info: modify/delete: olcTLSCACertificateFile: no equality matching rule
fullchain.pem 文件不是 cert.pem 文件上方证书链的串联,它是 chain.pem 和 cert.pem 文件的串联。
chain.pem 文件和根权限文件必须连接到您将作为 olcTLSCACertificateFile 呈现给 slapd 的文件中
privkey.pem 文件必须作为 olcTLSCertificateKeyFile 提供给 slapd。
简单的 cert.pem 文件必须作为 olcTLSCertificateFile 提交给 slapd。
我不确定连接的顺序是否重要,但这是我使用的顺序:cat chain.pem root.pem > ca.merged.crt
您使用的 openssl 测试显示在这样设置时一切正常。
可以在此处找到根权限文件: https ://www.identrust.com/certificates/trustid/root-download-x3.html
测试:
您是否启用了任何额外的安全措施(如 apparmor)来限制对证书的读取访问?我收到了同样的错误消息
ldap_modify: Other (e.g., implementation specific) error (80)
,因为 apparmor 不允许 openldap 访问 let's encrypt 证书:以下步骤为我解决了这个问题:
将行添加到
/etc/apparmor.d/local/usr.sbin.slapd
:/etc/letsencrypt/** r,
service apparmor restart
您的 OpenLDAP 服务器似乎没有配置 TLS。
您
/etc/ldap/slapd.d/cn=config.ldif
应该具有以下内容:您应该通过 ldapmodify 添加它。
有一篇关于这个主题的漂亮博客文章。它适用于我
https://www.dahlem.uk/display/deb/Configure+and+enable+TLS+for+OpenLDAP更新(archive.org 上的博客备份):https ://web.archive.org/web/20161023210915/http://www.dahlem.uk:80/display/deb/Configure+and+enable+TLS+for+开放式LDAP
我的系统是这样的:
在这里快速浏览一下。处理文件系统访问letsencrypt ...
激活服务...
并告诉 openldap 你的证书......
读取 ldif 文件...
最后重新启动并检查 slapd。
我在使用OpenLDAP设置Lets Encrypt的认证时遇到了同样的问题
错误:
日志文件包含:
我找到了以下解决方案:
/etc/apparmor.d/usr.sbin.slapd
/etc/letsencrypt/archive/your.domain.tld/* r,
*apparmor*:
服务apparmor重启`ldapmodify
再次执行我遇到了同样的问题,几个小时后发现最简单的解决方案是:将 pem 文件复制到 /etc/openldap/certs 并将 fullchain.pem 用于 olcTLSCACertificateFile。(似乎不需要根 CA)。同样重要的是:olcTLSCertificateFile 和 olcTLSCertificateKeyFile 访问权限应分别为 644 ldap ldap 和 600 ldap ldap。
执行此操作的 ansible playbook 看起来像这样,以使其易于自动化:
当我将“实时”路径更改为“存档”时,我设法做到了:
并允许 openldap 用户使用例如读取这些文件: setfacl -m "u:openldap:r" /etc/letsencrypt/archive/SOMEDOMAIN/{fullchain1,cert1,privkey1}.pem
当你得到一个 fullchain.pem 时,你根本不需要配置 CA,因为这个文件已经包含了根 ca、中间件和服务器证书。
使用fullchain.pem作为olcTLSCertificateFile和 privkey.pem 作为 olcTLSCertificateKeyFile。
如果您收到错误 80 =>(其他(例如,特定于实现)错误 (80)):
编写一个 ldapmodify 文件 - ssl.mod:
应用配置:
很酷的是,您可以将最后一个命令用作 certbot --deploy-hook 并旋转证书,而无需在 renew 上重新启动 slapd。
stackexchange 上和其他地方的许多人都指出,节的权限和顺序很重要,但最终帮助我的是:
通过第三个循环,我知道它们必须按什么顺序加载。