在 openLDAP 中使用 Lets Encrypt 證書
我已經執行了幾個月的 openLDAP 伺服器,我們使用它來對許多應用程序進行身份驗證。以前的工作人員設置了伺服器,它似乎不是標準安裝,但它非常簡單。
最近我們的一個 CA 證書過期了,我們決定用 Let’s Encrypt 替換它。我的經理更換了伺服器上的證書。
它適用於 Web 應用程序(LDAP 管理器、自助服務密碼更改),但是沒有客戶端可以針對它進行身份驗證。例如,如果我嘗試測試 Redmine LDAP 配置,我會收到一條消息“無法連接(SSL_connect SYSCALL returned=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
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:在/連接初始化之前 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=數字簽名信任公司/CN=DST Root CA X3 -----開始證書----- [已編輯] -----結束證書----- 2 s:/O=數字簽名信任公司/CN=DST Root CA X3 i:/O=數字簽名信任公司/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: 萬能鑰匙:[已編輯] 鍵-Arg:無 Krb5 主體:無 PSK 身份:無 PSK 身份提示:無 開始時間:1487882605 超時:300(秒) 驗證返回碼:0(ok) ---