ldaps://<server_name>:<port>
다양한 애플리케이션(예: Gitlab)에 TLS를 통한 보안 LDAP 연결을 사용하려고 합니다. 그러나 LDAP 관리자가 자체 서명된 인증서를 사용하기 때문에 연결 시 인증서 오류가 발생합니다.
내가 시도한 것은 다음과 같습니다.
curl "ldap://ldapserver.example.com:389/DC=example,DC=com?sAMAccountName?sub?(memberOf=CN=custom-group,DC=example,DC=com)" -u [email protected]
예상대로 작동하고 원하는 쿼리 결과를 반환하지만 분명히 안전하지 않습니다.
내가 시도할 때:
curl -v "ldaps://ldapserver.example.com:636/DC=example,DC=com?sAMAccountName?sub?(memberOf=CN=custom-group,DC=example,DC=com)" -u [email protected]
나는 가지고있다:
* About to connect() to ldapserver.example.com port 636 (#0)
* Trying 10.10.10.10...
* Connected to ldapserver.example.com (10.10.10.10) port 636 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* Server certificate:
* subject: CN=ldapserver.example.com
* start date: Jan 14 15:00:00 2018 GMT
* expire date: Dec 24 14:59:59 2019 GMT
* common name: ldapserver.example.com
* issuer: O=EXAMPLE,C=UK
* NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)
* Peer's Certificate issuer is not recognized.
* Closing connection 0
curl: (60) Peer's Certificate issuer is not recognized.
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn't adequate, you can specify an alternate file
using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure) option.
이 플래그를 사용하여 동일한 명령을 시도 --insecure
하고 LDAP 서버에 연결하면 결과가 반환되지 않습니다.
* About to connect() to ldapserver.example.com port 636 (#0)
* Trying 10.10.10.10...
* Connected to ldapserver.example.com (10.10.10.10) port 636 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* NSS: client certificate not found (nickname not specified)
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate:
* subject: CN=ldapserver.example.com
* start date: Jan 14 15:00:00 2018 GMT
* expire date: Dec 24 14:59:59 2019 GMT
* common name: ldapserver.example.com
* issuer: O=EXAMPLE,C=UK
* LDAP local: ldaps://ldapserver.example.com:636/DC=example,DC=com?sAMAccountName?sub?(memberOf=CN=custom-group,DC=example,DC=com)
좋아, 이제 다음을 시도했습니다 ldapsearch
.
ldapsearch -x -b 'dc=example,dc=com' -D '[email protected]' -H "ldaps://ldapserver.example.com:636" -W '(memberOf=CN=custom-group,DC=example,DC=com)'
그리고 얻다:
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
위와 동일한 ldapsearch 명령을 실행하고 실행한 후 export LDAPTLS_REQCERT=never
쿼리 결과가 반환되었습니다.
인증서 확인을 비활성화하는 것은 분명히 좋은 옵션이 아닙니다. 특히 Gitlab에서 LDAP 인증을 사용하는 경우 더욱 그렇습니다.
신뢰할 수 있는 인증서에 LDAP 서버의 인증서를 추가하여 인증서를 얻으려고 했습니다.
echo -n | openssl s_client -connect ldapserver.example.com:636 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ldapserver.example.com.pem
그런 다음 그것을 넣고 /etc/pki/ca-trust/source/anchors/
ca-trust를 업데이트했습니다.
cp ldapserver.example.com.pem /etc/pki/ca-trust/source/anchors/ldapserver.example.com.crt
update-ca-trust extract
그러나 위 명령은 동일한 결과를 반환합니다.
실제로 인증서만 포함하는 CA 체인을 추가해야 할 수도 있습니다.
openssl s_client -showcerts -verify -connect ldapserver.example.com:636 < /dev/null
verify depth is 5
CONNECTED(00000003)
depth=0 CN = ldapserver.example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = ldapserver.example.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/CN=ldapserver.example.com
i:/C=UK/O=EXAMPLE
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=ldapserver.example.com
issuer=/C=UK/O=EXAMPLE
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:ECDSA+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA1:ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA1:DSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:ECDSA+SHA512:RSA+SHA256:RSA+SHA384:RSA+SHA1:ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA1:DSA+SHA1
Peer signing digest: SHA1
Server Temp Key: ECDH, P-521, 521 bits
---
SSL handshake has read 1666 bytes and written 563 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-SHA384
Session-ID: 12345678912345678912345791234567891234567891234579
Session-ID-ctx:
Master-Key: 123456789123456789123457912345678912345678912345791234567891234567891234579
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1540914932
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
DONE
그래서 내 질문은: 인증서 확인이 작동하는 방식으로 인증서를 어떻게 추가합니까? 내가 할 수 있을까? 아니면 정보를 제공하기 위해 LDAP 관리자에게 문의해야 합니까?
다음은 시스템 및 도구에 대한 몇 가지 정보입니다.
RHEL 7.5
ldapsearch -V -v
ldapsearch: @(#) $OpenLDAP: ldapsearch 2.4.44 (Apr 3 2018 08:03:33) $
[email protected]:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/clients/tools
(LDAP library: OpenLDAP 20444)
ldap_initialize( <DEFAULT> )
ldap_sasl_interactive_bind_s: Can't contact LDAP server (-1)
curl -V -v
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.28.4 zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets
답변1
비록 처음 질문 이후 많은 시간이 흘렀지만, 비슷한 상황에 처해 있는 잃어버린 영혼들에게 도움이 되고자 답변을 드리고 싶었습니다.
LDAP 시스템은 실제로활성 디렉터리그리고 네트워크를 통해 CA 인증서를 얻을 수 있는 방법이 없습니다(적어도 아직 방법을 찾지 못했습니다). 그래서 우리는 Windows 팀에 문의하고 담당 관리자에게 연락하여 CA 인증서를 줄 수 있는지 물었습니다. 관리자가 이를 내보냈으므로 이를 PEM 파일로 변환하고 적절한 디렉토리에 배치한 후 명령을 실행하면 됩니다 update-ca-trust
.
이 같은:
openssl x509 -inform der -in ca.example.com.cer -out ca.example.com.pem
cp ca.example.com.pem /etc/pki/ca-trust/source/anchors/ca.example.com.pem
update-ca-trust
인증서 문제가 해결되었으며 부분 결과만 검색하는 등 컬과 관련된 다른 문제가 있었기 때문에 ldapsearch
대신 계속 사용했습니다.curl