Автор Тема: Проверка сертификата SSL  (Прочитано 133 раз)

2life

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Проверка сертификата SSL
« : 12 Август 2019, 09:45:29 »
Добрый день,
В целом и общем сервер OpenLDAP у меня прекрасно заработал. При запуске секция TLS была пропущена. Сейчас нужно к ней вернуться.
На данный момент при попытке подключится, через SSL получаю след. ошибку:

#ldapsearch -xZZLLLWD cn=admin,dc=domain,dc=lan -b cn=config -s base
ldap_start_tls: Connect error (-11)
        additional info: (unknown error code)
Без защиты:
/etc/ldap/tmp# ldapsearch -xLLLWD cn=admin,dc=domain,dc=lan -b cn=config -s base
Enter LDAP Password:
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: any
olcPidFile: /var/run/slapd/slapd.pid
olcTLSVerifyClient: never
olcToolThreads: 1
olcTLSCertificateFile: /etc/ldap/ssl/ldapsrv.domain.lan.crt
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldapsrv.domain.lan.key
olcTLSCACertificateFile: /etc/ldap/ssl/private/rootca.key

В логах вижу следующее:
Aug  9 19:01:46 fssrv2 slapd[23182]: connection_get(14): got connid=1001
Aug  9 19:01:46 fssrv2 slapd[23182]: connection_read(14): checking for input on id=1001
Aug  9 19:01:46 fssrv2 slapd[23182]: connection_read(14): unable to get TLS client DN, error=49 id=1001
Aug  9 19:01:46 fssrv2 slapd[23182]: conn=1001 fd=14 TLS established tls_ssf=256 ssf=256
Но т.к. используется TLSVerifyclient never, и на клиенте tls_reqcert "demand", то на ошибку «unable to get TLS client DN» можно внимание не обращать. Я верно понял?

При проверке через openssl картина такая:
root@ldapsrv:/etc/ldap/ssl# openssl s_client -connect 127.0.0.1:636 -CAfile /etc/ldap/ssl/ldapsrv.domain.lan.crt
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 C = RU, ST = CITY, O = COMPANY, OU = ITdept, CN = ldapsrv.domain.lan, emailAddress = info@domain.lan
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = RU, ST = CITY, O = COMPANY, OU = ITdept, CN = ldapsrv.domain.lan, emailAddress = info@domain.lan
verify error:num=21:unable to verify the first certificate
verify return:1
.......
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2143 bytes and written 373 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 4096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)


Опять я «забуксовал»...
« Последнее редактирование: 12 Август 2019, 13:04:02 от 2life »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 434
    • Просмотр профиля
Re: Проверка сертификата SSL
« Ответ #1 : 12 Август 2019, 13:32:21 »
Здравствуйте! Чтобы правильно настроить TLS-сессию, нужно немного знать о сертификатах и процессе доверия. В двух словах об этом не расскажешь, если интересно, можно почитать этот материал.

По существу Вашего вопроса. Сначала нужно разобраться, как был сгенерирован сертификат для Вашего LDAP-сервера. В настройках LDAP-сервера есть атрибут olcTLSCACertificateFile, значением которого должен быть путь к сертификату удостоверяющего центра, закрытым ключом которого подписан сертификат LDAP-сервера. То есть ситуация может быть двоякая:

Первый вариант: у Вас уже был корневой сертификат и закрытый ключ удостоверяющего центра, и Вы с их помощью подписали сертификат для сервера LDAP. В этом случае в атрибуте olcTLSCertificateFile указывается путь к сертификату сервера LDAP, а в атрибуте olcTLSCACertificateFile -- путь к сертификату удостоверяющего центра, с помощью которого можно удостовериться в действительности сертификата сервера LDAP.
Второй вариант: Вы сгенерировали так называемый "самоподписанный" сертификат для сервера LDAP, то есть сертификат, подписанный своим же закрытым ключом. В этом случае в обоих атрибутах  olcTLSCertificateFile и olcTLSCACertificateFile указывается путь к сертификату сервера, поскольку он его помощью проверяется действительность самого себя.

В любом случае, в атрибуте olcTLSCACertificateFile указывается именной файл сертификата, а не файл ключа (у Вас же, скорее всего, там указан файл закрытого ключа).

Далее, чтобы LDAP-клиент смог проверить действительность сертификата сервера, он должен знать где получить файл сертификата удостоверяющего центра, закрытым ключом которого подписан сертификат LDAP-сервера. То есть, в настройках LDAP-клиента (/etc/ldap/ldap.conf) должна быть задана как минимум директива TLS_CACERT, в которой при первом рассмотренном нами варианте указывается путь к сертификату удостоверяющего центра, а при втором -- путь к самому сертификату сервера LDAP.

Потом, когда Вы вызываете команду ldapsearch с параметрами ZZ, Вы указываете LDAP-клиенту подключиться к порту 389, а затем выполнить операцию StartTLS. А при вызове openssl s_client пытаетесь подключиться к порту 636. С какими параметрами запущен Ваш сервер slapd (вывод команды ps ax | grep slapd)?

Наконец, для проверки действительности сертификата, при подключении к серверу нужно указывать то имя, которое фигурирует в атрибуте CN сертификата. То есть в первом нашем случае (с отдельным сертификатом удостоверяющего центра) вызов команды openssl s_client должен выглядеть так:
# openssl s_client -connect ldapsrv.domain.lan:636 -CAfile /etc/ldap/ssl/rootca.crt
(в последнем параметре нужно указать правильный путь к сертификату удостверяющего центра).
Во втором так:
# openssl s_client -connect ldapsrv.domain.lan:636 -CAfile /etc/ldap/ssl/ldapsrv.domain.lan.crt

Как видите, тонкостей много и затык может быть в любом месте. Надеюсь, мои замечания наведут на нужные мысли.

Егор

2life

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Проверка сертификата SSL
« Ответ #2 : 12 Август 2019, 14:47:18 »
Мой случай это второй случай (с самоподписанным сертификатом).  Вы правы, я указал файл ключа, а не сертификата, и даже не заметил этого J. Ошибку поправил.

Вывод команды следующий:

root@ldapsrv:/etc/ldap/tmp# ps ax | grep slapd
 9954 ?        Ssl    0:00 /usr/sbin/slapd -h ldap:/// ldapi:/// ldaps:/// -g openldap -u openldap -F /etc/ldap/slapd.d

Ситуация с проверкой продвинулась дальше, но ненамного, к сожалению.

Вот так вроде нормально всё
root@ldapsrv:/etc/ldap/ssl# openssl verify -verbose -x509_strict -CAfile rootca.crt ldapsrv.domain.lan.crt
ldapsrv.domain.lan.crt: OK

Тут уже не очень...
root@ldapsrv:/etc/ldap/tmp# openssl s_client -connect ldapsrv.domain.lan:636 -showcerts -CApath /etc/ldap/ssl/
CONNECTED(00000003)
depth=1 C = RU, ST = CITY, L = CITY, O = COMPANY, OU = ITdept, CN = ca-server, emailAddress = info@domain.lan
verify error:num=19:self signed certificate in certificate chain
verify return:1
depth=1 C = RU, ST = CITY, L = CITY, O = COMPANY, OU = ITdept, CN = ca-server, emailAddress = info@domain.lan
verify return:1
depth=0 C = RU, ST = CITY, O = COMPANY, OU = ITdept, CN = ldapsrv.domain.lan, emailAddress = info@domain.lan
verify return:1

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3218 bytes and written 401 bytes
Verification error: self signed certificate in certificate chain
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 4096 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 19 (self signed certificate in certificate chain)

Пока отправился гуглить.

2life

  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Проверка сертификата SSL
« Ответ #3 : 12 Август 2019, 14:55:34 »
А по итогу всё работает :) Я ldapsearch сделал вот только сейчас.
Это не ошибка видимо, а предупреждение, про сертификат самоподписанный.
Вообщем виноват только сам, т.к. запутался между сертификатом, и ключом.
Большое спасибо! Вроде бы у меня вопросы закончились. Путь пройдён по настройке OpenLDAP.
« Последнее редактирование: 12 Август 2019, 15:05:00 от 2life »