無法使 TLS 工作的 OpenLDAP
我有一個在 Centos 7 主機上執行的 OpenLDAP 2.4.39 伺服器,該主機填充了最少的數據集。當不使用 TLS 時,它按預期工作。我今天用它來驗證dokuwiki。我從 Namecheap/Comodo 購買了一個 SSL,並試圖讓它正常工作。
例子:
root@smtp:~# ldapsearch -h ldap.foo.bar -D cn=Manager,dc=foo,dc=bar -W -LLL -b ou=people,dc=foo,dc=bar "(uid=baz)" Enter LDAP Password: dn: uid=baz,ou=people,dc=foo,dc=bar objectClass: top objectClass: inetOrgPerson objectClass: organizationalPerson cn:: SGFucyDDhWdlIE1hcnRpbnNlbg== displayName:: SGFucyDDhWdlIE1hcnRpbnNlbg== givenName:: SGFucyDDhWdl mail: baz@something.fugu mobile: 12345678 sn: Doe uid: baz
如果我嘗試強制使用 TLS,事情就會發生變化。
root@smtp:~# ldapsearch -h ldap.foo.bar -D cn=Manager,dc=foo,dc=bar -W -LLL -b ou=people,dc=foo,dc=bar -ZZ "(uid=baz)" ldap_start_tls: Connect error (-11) additional info: A TLS packet with unexpected length was received. root@smtp:~# ldapsearch -h ldap.foo.bar -D cn=Manager,dc=foo,dc=bar -W -LLL -b ou=people,dc=foo,dc=bar -ZZ -d -1 "(uid=baz)" ... ... TLS: can't connect: A TLS packet with unexpected length was received.. ldap_err2string ldap_start_tls: Connect error (-11) additional info: A TLS packet with unexpected length was received.
LDAP 伺服器上的配置。
dn: cn=config objectClass: olcGlobal cn: config olcArgsFile: /var/run/openldap/slapd.args olcPidFile: /var/run/openldap/slapd.pid structuralObjectClass: olcGlobal entryUUID: 5760d8da-0f87-1035-85b1-9b4063f1519b creatorsName: cn=config createTimestamp: 20151025171240Z olcIdleTimeout: 300 olcLogLevel: none olcTLSCACertificateFile: /etc/openldap/tls/ldap.foo.bar.ca_bundle olcTLSCertificateFile: /etc/openldap/tls/ldap.foo.bar.crt olcTLSCertificateKeyFile: /etc/openldap/tls/ldap.foo.bar.key olcTLSCipherSuite: HIGH:MEDIUM:+SSLv2 entryCSN: 20151025205018.128335Z#000000#000#000000 modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth modifyTimestamp: 20151025205018Z [root@ldap tls]# ls -l total 16 -rw-r--r-- 1 root root 5630 Oct 25 17:14 ldap.foo.bar.ca_bundle -rw-r--r-- 1 root root 2240 Oct 25 17:14 ldap.foo.bar.crt -r-------- 1 root root 3243 Oct 25 17:14 ldap.foo.bar.key [root@ldap tls]# file ldap.foo.bar.ca_bundle ldap.foo.bar.ca_bundle: PEM certificate [root@ldap tls]# file ldap.foo.bar.crt ldap.foo.bar.crt: PEM certificate [root@ldap tls]# file ldap.foo.bar.key ldap.foo.bar.key: PEM RSA private key
客戶端上的配置:我已將 CA 捆綁包添加到客戶端 ca 證書中。客戶端是 Debian 主機,我將包複製到該主機
/usr/local/share/ca-certificates/
並執行命令update-ca-certificates
從我可以看到和閱讀的內容來看,這應該有效。但事實並非如此。如果我嘗試從 ldap 伺服器本身執行相同的搜尋,它也不起作用。我正在努力進一步調試,因為我不知道從哪裡開始。關於我可以研究什麼以使其發揮作用的任何建議?所有配置文件在發布之前都是手動編輯的,所以我可能犯了錯誤,但我不認為是這種情況。
在收到請求後添加。
Oct 25 20:50:54 ldap slapd[21177]: daemon: shutdown requested and initiated. Oct 25 20:50:54 ldap slapd[21177]: slapd shutdown: waiting for 0 operations/tasks to finish Oct 25 20:50:54 ldap slapd[21177]: slapd stopped. Oct 25 20:50:54 ldap slapd[21670]: @(#) $OpenLDAP: slapd 2.4.39 (Sep 29 2015 13:31:12) $ mockbuild@worker1.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd Oct 25 20:50:54 ldap slapd[21673]: hdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2). Expect poor performance for suffix "dc=foo,dc=bar". Oct 25 20:50:54 ldap slapd[21673]: slapd starting Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (uid) not indexed Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (gidNumber) not indexed Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (memberUid) not indexed Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (uid) not indexed Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (gidNumber) not indexed Oct 25 21:23:19 ldap slapd[21673]: <= bdb_equality_candidates: (memberUid) not indexed Oct 26 07:30:08 ldap slapd[21673]: daemon: shutdown requested and initiated. Oct 26 07:30:08 ldap slapd[21673]: slapd shutdown: waiting for 0 operations/tasks to finish Oct 26 07:30:08 ldap slapd[21673]: slapd stopped. Oct 26 07:30:08 ldap slapd[23274]: @(#) $OpenLDAP: slapd 2.4.39 (Sep 29 2015 13:31:12) $ mockbuild@worker1.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd Oct 26 07:30:08 ldap slapd[23275]: slapd starting [root@ldap log]#
看到此日誌後,我將 /usr/share/openldap-servers/DB_CONFIG.example 添加到 /var/lib/ldap/DB_CONFIG 並完成了
systemctl restart slapd
. 因為我希望 TLS 首先工作,所以我沒有專注於獲取正確的索引並開始工作。
我的問題的答案比最初想像的要簡單。在我之前的配置中,我有以下設置。
olcTLSCipherSuite: HIGH:MEDIUM:+SSLv2
如您所見,它沒有明確允許 TLS。我重新配置了這個設置,它現在完美無缺。
olcTLSCipherSuite: HIGH:+SSLv3:+TLSv1:MEDIUM:+SSLv2:@STRENGTH:+SHA:+MD5:!NULL
稍後我可能會刪除 SSLv2 和 MD5。如果客戶不支持其他任何東西,我無法決定是否讓他們在那里至少給他們一定程度的有用性。
一般來說,
- 使用 SSL Swiss Army Knife openssl命令通常比通過輸出完整的 C/S SSL 應用程序更容易診斷 TLS/SSL 錯誤;這裡 esp openssl 的s_client子命令可能會有所幫助。
- olc 通過組合多個 olcLogLevel 提供豐富的診斷輸出;請參閱表5.1 的表 5.1:openldap 的 slapd.conf 參考的調試級別。如果我的記憶沒有背叛我,那麼它的標誌在數字上小於或等於“BER”,它(也)啟用了 SSL/TLS 跟踪。
話雖這麼說 - 從上面的 olc 列表看來
olcTLSVerifyClient
不存在,更不用說設置為“要求”或“允許”。
MECH_AND_URL="-H ldapi:///" # or whatever your setup needs; your mileage may vary ldapsearch -b cn=config $MECH_AND_URL "(cn=config)" olcTLSVerifyClient -LLL
如果確實沒有產生任何結果,請創建並設置它:
ldapmodify $MECH_AND_URL <<EOF dn: cn=config changetype: modify add: olcTLSVerifyClient olcTLSVerifyClient: allow - EOF