我已经运行了几个月的openLDAP服务器,我们使用它来validation许多应用程序。 以前的工作人员build立服务器,它似乎不是一个标准的安装,但它非常简单。
最近,我们的一个CA证书过期了,我们决定用Let's Encrypt取代它。 我的经理取代了服务器上的证书。
它适用于Web应用程序(LDAPpipe理器,自助服务密码更改),但是没有客户端可以对其进行身份validation。 例如,如果我尝试testingRedmine LDAPconfiguration,则会收到一条消息:“无法连接(SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv2 / v3读取服务器hello A)”
testingNexus身份validation,它只是不连接。
令人沮丧的是,LDAP服务器上的日志或者应用程序的日志中都没有指出为什么会失败。 我的调查使我相信,这是证书/密钥configuration的一些事情,但我已经尝试了所有我能想到的,以及我可以在网上find的一切,没有任何工作。
环境细节是:
Debian 8 openLDAP openldap-2.4.40
我的configuration如下:
/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
如果我testing连接:
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的build议,我编辑了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 (eg, implementation specific) error (80)
我发现这可能是由于对证书或密钥文件的权限,但我改变了这些与以前使用的文件的完全匹配,并仍然得到这个消息的build议。
我再一次对这个话题缺乏一般性的知识表示歉意,但任何人都可以提出其他build议吗?
编辑
根据这个build议,我改变了tls.ldif并把所有的命令从replace更改为delete,然后再次运行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文件和根权限文件必须连接到您要呈现给slapd的文件中作为olcTLSCACertificateFile
privkey.pem文件必须作为olcTLSCertificateKeyFile呈现给slapd。
简单的cert.pem文件必须作为olcTLSCertificateFile呈现给slapd。
我不确定连接的顺序是否重要,但这是我使用的顺序:cat chain.pem root.pem> ca.merged.crt
您使用的openssltesting显示,如此设置时,一切正常。
根权限文件可以在这里find: https : //www.identrust.com/certificates/trustid/root-download-x3.html
testing:
[root @█████ssl]#openssl s_client -connect [删除]:636 -showcerts -state -CAfile ca.merged.crt
连(00000003)
SSL_connect:在/连接初始化之前
SSL_connect:SSLv2 / v3写入客户端hello A.
SSL_connect:SSLv3读取服务器hello A.
深度= 2 O = Digital Signature Trust Co.,CN = DST根CA X3
validation退货:1
深度= 1 C = US,O =我们encryption,CN =我们encryption权限X3
validation退货:1
深度= 0 CN = [编辑]
validation退货:1
SSL_connect:SSLv3读取服务器证书
SSL_connect:SSLv3读取服务器密钥交换A
SSL_connect:完成SSLv3读取服务器A
SSL_connect:SSLv3写客户端密钥交换
SSL_connect:SSLv3写入更改密码规格A
SSL_connect:SSLv3写入完成
SSL_connect:SSLv3刷新数据
SSL_connect:SSLv3读完A
---
证书链
0 s:/ CN = [编辑]
我:/ C = US / O =我们encryption/ CN =我们encryption权限X3
----- BEGIN CERTIFICATE -----
[删除]
-----结束证书-----
1 s:/ C = US / O =我们encryption/ CN =我们encryption权限X3
我:/ O =数字签名信任有限公司/ CN = DST根CA X3
----- BEGIN CERTIFICATE -----
[删除]
-----结束证书-----
2 s:/ O =数字签名信任有限公司/CN=DST根CA X3
我:/ O =数字签名信任有限公司/ CN = DST根CA X3
----- BEGIN CERTIFICATE -----
[删除]
-----结束证书-----
---
服务器证书
受试者= / CN = [删除]
issuer = / C = US / O =我们encryption/ CN =我们encryption权限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:
主密钥:[编纂]
Key-Arg:无
Krb5负责人:无
PSK身份:无
PSK身份提示:无
开始时间:1487882605
超时:300(秒)
validation返回码:0(ok)
---
您的OpenLDAP服务器似乎没有configurationTLS。
你的/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添加。
你有任何额外的安全措施启用(如apparmor)限制读取访问您的证书? 我得到了同样的错误消息ldap_modify: Other (eg, implementation specific) error (80)因为apparmor不允许openldap访问我们的encryption证书:
以下步骤解决了我的问题:
将行添加到/etc/apparmor.d/local/usr.sbin.slapd /etc/letsencrypt/** r,
service apparmor restart
有一个关于这个话题的美丽的博客文章。 它适用于我https://www.dahlem.uk/display/deb/Configure+and+enable+TLS+for+OpenLDAP
我的系统是这样的:
# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.8 (jessie) Release: 8.8 Codename: jessie # slapd -V @(#) $OpenLDAP: slapd (Jul 16 2017 19:57:41) $ Debian OpenLDAP Maintainers <[email protected]>
这里快速通过。 处理文件系统访问letsencrypt …
useradd letsencrypt chown openldap:letsencrypt /etc/letsencrypt/ -R usermod -a -G letsencrypt openldap
激活服务…
# /etc/default/slapd SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
并告诉openldap你的证书…
# /root/add_ssl.ldif dn: cn=config changetype: modify add: olcTLSCipherSuite olcTLSCipherSuite: NORMAL - add: olcTLSCRLCheck olcTLSCRLCheck: none - add: olcTLSVerifyClient olcTLSVerifyClient: never - add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/letsencrypt/live/YOURDOMAIN/fullchain.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/letsencrypt/live/YOURDOMAIN/cert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/letsencrypt/live/YOURDOMAIN/privkey.pem - add: olcTLSProtocolMin olcTLSProtocolMin: 3.3
阅读ldif文件…
ldapmodify -Y EXTERNAL -H ldapi:/// -f add_ssl.ldif
最后重启并检查slapd。
systemctl restart slapd.service systemctl status slapd.service