在 openLDAP 中使用 Lets Encrypt 证书

sha*_*eoh 6 openldap ldap ssl-certificate lets-encrypt

我已经运行 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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

如果我测试连接:

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
Run Code Online (Sandbox Code Playgroud)

有谁知道我错过了什么?

编辑

根据@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
Run Code Online (Sandbox Code Playgroud)

然后运行命令:

ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
Run Code Online (Sandbox Code Playgroud)

但是我现在得到的输出是:

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)
Run Code Online (Sandbox Code Playgroud)

我发现这可能是由于对证书或密钥文件的权限,但我将这些更改为与以前使用的文件上的完全匹配,但仍然收到此消息。

我再次为我缺乏对该主题的一般知识而道歉,但有人可以提出其他建议吗?

编辑

根据建议,我更改了 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
Run Code Online (Sandbox Code Playgroud)

Ghi*_*aul 12

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

测试:

[根@?????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
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
验证返回:1
depth=1 C = US, 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 秒:/CN=[已编辑]
   i:/C=US/O=让我们加密/CN=让我们加密授权 X3
-----开始认证-----
[已编辑]
-----结束证书-----
 1 s:/C=US/O=让我们加密/CN=让我们加密权限 X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----开始认证-----
[已编辑]
-----结束证书-----
 2 s:/O=Digital Signature Trust Co./CN=DST Root CA X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----开始认证-----
[已编辑]
-----结束证书-----
---
服务器证书
主题=/CN=[已编辑]
issuer=/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(确定)
---


小智 6

您是否启用了任何额外的安全措施(如 apparmor)来限制对您的证书的读取访问?我收到了同样的错误消息,ldap_modify: Other (e.g., implementation specific) error (80)因为 apparmor 不允许 openldap 访问让我们加密证书:

以下步骤为我解决了这个问题:

  • 添加行到/etc/apparmor.d/local/usr.sbin.slapd/etc/letsencrypt/** r,

  • service apparmor restart