Linux

無法使 TLS 工作的 OpenLDAP

  • October 27, 2015

我有一個在 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

引用自:https://serverfault.com/questions/731565