我已经运行 openLDAP 服务器几个月了,我们用它来验证许多应用程序。以前的一名员工设置了服务器,它似乎不是标准安装,但相当简单。
最近,我们的一个 CA 证书过期了,我们决定用 Let's Encrypt 替换它。我的经理替换了服务器上的证书。
它适用于 Web 应用程序(LDAP 管理器,自助密码更改),但没有客户端可以对其进行身份验证。例如,如果我尝试测试 Redmine LDAP 配置,我会收到一条消息,提示“无法连接(SSL_connect SYSCALL 返回=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
答案1
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
测试:
[root@█████ ssl]# openssl s_client -connect [删除]:636 -showcerts -state -CAfile ca.merged.crt 已连接(00000003) SSL_connect:before/connect 初始化 SSL_connect:SSLv2/v3 写客户端 hello A SSL_connect:SSLv3 读取服务器 hello A 深度=2 O = 数字签名信托公司,CN = DST Root CA X3 验证返回:1 深度=1 C = 美国,O = Let's Encrypt,CN = Let's Encrypt Authority X3 验证返回:1 深度=0 CN = [已编辑] 验证返回:1 SSL_connect:SSLv3读取服务器证书A SSL_connect:SSLv3读取服务器密钥交换A SSL_connect:SSLv3读取服务器完成A SSL_connect:SSLv3写客户端密钥交换A SSL_connect:SSLv3 写入更改密码规范 A SSL_connect:SSLv3写入完成A SSL_connect:SSLv3刷新数据 SSL_connect:SSLv3读取完成A --- 证书链 0 s:/CN=[删除] i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 -----开始证书----- [删除] -----证书结束----- 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 i:/O=数字签名信任公司/CN=DST Root CA X3 -----开始证书----- [删除] -----证书结束----- 2 s:/O=数字签名信托公司/CN=DST Root CA X3 i:/O=数字签名信任公司/CN=DST Root CA X3 -----开始证书----- [删除] -----证书结束----- --- 服务器证书 主题=/CN=[已编辑] 发行者=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3 --- 未发送客户端证书 CA 名称 服务器临时密钥:ECDH,secp384r1,384 位 --- SSL 握手已读取 4417 个字节并写入 405 个字节 --- 新的 TLSv1/SSLv3,密码为 ECDHE-RSA-AES256-GCM-SHA384 服务器公钥为4096位 支持安全重新协商 压缩:无 扩展:无 SSL 会话: 协议:TLSv1.2 密码:ECDHE-RSA-AES256-GCM-SHA384 会话 ID:[已编辑] 会话 ID-ctx: 万能钥匙:[删除] 关键参数:无 Krb5 校长:无 PSK 身份:无 PSK 身份提示:无 开始时间:1487882605 超时:300(秒) 验证返回代码:0(确定) ---
答案2
您是否启用了任何额外的安全措施(如 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
答案3
您的 OpenLDAP 服务器似乎未配置 TLS。
你/etc/ldap/slapd.d/cn=config.ldif
应该有类似下面的内容:
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key
olcTLSCACertificateFile: /etc/ldap/ssl/ldap_ca.cert
olcTLSCertificateFile: /etc/ldap/ssl/ldap.cert
olcTLSCipherSuite: HIGH:!aNull:!MD5:@STRENGTH
olcTLSProtocolMin: 3.1
您应该通过 ldapmodify 添加它。
答案4
我在设置认证时遇到了同样的问题让我们加密和OpenLDAP
错误:
~ # ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl.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)
日志文件包含:
... apparmor="DENIED" operation="open" profile="/usr/sbin/slapd" name="/etc/letsencrypt/archive/your.domain.tld/fullchain1.pem" ...
我找到了以下解决方案:
- 编辑文件
/etc/apparmor.d/usr.sbin.slapd
- 添加行:
/etc/letsencrypt/archive/your.domain.tld/* r,
- 重新启动
*apparmor*:
服务 apparmor restart` - 现在
ldapmodify
再次执行