Назад | Перейти на главную страницу

Убедить openldap работать с SSL в Ubuntu с помощью cn = config

Я просто не могу заставить это (соединение TLS с openldap) работать и был бы признателен за помощь.

У меня есть рабочий сервер openldap на ubuntu 10.04 LTS, он настроен на использование cn = config, и большая часть информации, которую я могу найти для TLS, похоже, использует более старый файл slapd.conf :-(

Я в основном следовал инструкциям здесь https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html плюс материал, который я читал здесь и в других местах - что, конечно, может быть частью проблемы, поскольку я еще не совсем понимаю все это!

Я создал файл ssl.ldif следующим образом;

dn:cn=config

add: olcTLSCipherSuite
olcTLSCipherSuite: TLSV1+RSA:!NULL
add: olcTLSCRLCheck
olcTLSCRLCheck: none
add: olcTLSVerifyClient
olcTLSVerifyClient: never
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ldap_cacert.pem
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/my.domain.com_slapd_cert.pem
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/my.domain.com_slapd_key.pem

и я импортирую его, используя следующую командную строку

ldapmodify -x -D cn=admin,dc=mydomain,dc=com -W -f ssl.ldif

Я отредактировал / etc / default / slapd так, чтобы в нем была следующая строка служб;

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

И каждый раз, когда я вношу изменения, я перезапускаю slapd с /etc/init.d/slapd restart

Следующая командная строка для проверки подключения без TLS работает нормально;

ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \
-b dc=mydomain,dc=com -H "ldap://mydomain.com" "cn=roger*"

Но когда я переключаюсь на ldaps с помощью этой командной строки;

ldapsearch -d 9 -D cn=admin,dc=mydomain,dc=com -w mypassword \
-b dc=mydomain,dc=com -H "ldaps://mydomain.com" "cn=roger*"

Вот что я получаю;

ldap_url_parse_ext(ldaps://mydomain.com)
ldap_create
ldap_url_parse_ext(ldaps://mydomain.com:636/??base)
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP mydomain.com:636
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 127.0.0.1:636
ldap_pvt_connect: fd: 3 tm: -1 async: 0
TLS: can't connect: A TLS packet with unexpected length was received..
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

Теперь, если я проверю netstat -al Я могу видеть;

tcp        0      0 *:www                   *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:https                 *:*                     LISTEN
tcp        0      0 *:ldaps                 *:*                     LISTEN
tcp        0      0 *:ldap                  *:*                     LISTEN

Я не уверен, что это тоже важно ... Я подозреваю, что это так;

openssl s_client -connect mydomain.com:636 -showcerts
CONNECTED(00000003)
916:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

Я думаю, что все свои сертификаты и т. Д. В порядке, и вот результаты некоторых проверок;

Если я сделаю это;

certtool -e --infile /etc/ssl/certs/ldap_cacert.pem

Я получаю результат проверки цепочки: Verified.

certtool -e --infile /etc/ssl/certs/mydomain.com_slapd_cert.pem

Выдает "certtool: последний сертификат не самоподписанный", но в остальном вроде нормально?

Где я ошибся? Конечно, заставить openldap безопасно работать на ubuntu должно быть легко и не требуется ученая степень в области ракетостроения!

Любые идеи?

Ссылка Роджера с тех пор испортилась, вот такая же на WayBack Machine в Internet Archive, по состоянию на последнюю дату, заархивированную до того, как он сменил свой сайт: https://web.archive.org/web/20150530064010/http://rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/

Я также взял на себя смелость добавить его контент ниже:

Отправная точка

Я предполагаю, что у вас есть работающая установка openldap (не защищенная) с использованием cn = config (база данных LDAP) для настройки, а не старый вариант slapd.conf. Если вы вносите изменения, редактируя slapd.conf, остальная часть этой статьи не для вас!

ШАГ ПЕРВЫЙ

Для начала создайте несколько самозаверяющих сертификатов. Если вы уже создали несколько сертификатов для веб-сервера с помощью openssl, первое, что вас заметит, это то, что они не будут работать с ldap. Вам нужны сертификаты в другом формате, и для их создания нам понадобится новый инструмент, которого у вас еще нет.

sudo -i
apt-get update
apt-get install gnutls-bin
certtool --generate-privkey --outfile /etc/ssl/private/ldap-ca-key.pem
certtool --generate-self-signed --load-privkey /etc/ssl/private/ldap-ca-key.pem --outfile /etc/ssl/certs/ldap-ca-cert.pem

Исправьте свои разрешения - полученные файлы должны быть доступны для чтения группе openldap.

Для этого добавьте пользователя openldap в группу ssl-cert, а затем убедитесь, что сертификаты и ключ принадлежат группе ssl-cert. Помните, что каталог / etc / ssl / private имеет строгие разрешения, поэтому вам нужно сделать это правильно.

adduser openldap ssl-cert
chgrp /etc/ssl/private/ldap-ca-key.pem

ШАГ ВТОРОЙ

Создайте подходящий файл ssl.ldif для импорта в базу данных конфигурации. Здесь стоит сказать, что у всех тех, что я видел в сети, были синтаксические ошибки, которые мешали им работать - и они не работают тихо, что заставляет вас думать, что они сработали! Обратите особое внимание на то, что дефисы синтаксически важны.

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap-ca-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap-ca-key.pem

ПРЕДУПРЕЖДЕНИЕ: не будьте умны и измените TLSCipherSuite на что-нибудь умное, например HIGH: MEDIUM: -SSLv2 - это директива openssl, и теперь вы обнаружите, что вы не можете перезапустить slapd, так как он не сработает при запуске :-( Для диагностики для этого попробуйте запустить slapd с помощью следующей команды;

slapd -d 16383

Если вы сделаете это, вы, вероятно, увидите следующее:

TLS: could not set cipher list HIGH:MEDIUM:+SSLv2.
main: TLS init def ctx failed: -1

Вы можете исправить это, отредактировав /etc/ldap/slapd.d/cn=config.ldif напрямую, если будете осторожны.

ШАГ ТРЕТИЙ

Импортируйте файл ssl.ldif и знайте, что вы должны видеть, когда он работает, а не то, что вы увидите, когда он не работает. Также имейте в виду, что если вы запускаете это несколько раз, вам нужно изменить добавление для замены в файле ssl.ldif.

ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif -v

-V дает вам подробный вывод. Убедитесь, что вы видите, как распечатываются новые записи, если там написано что-то вроде;

modifying entry "cn=config"
modify complete

Тогда это НЕ означает, что это сработало. Скорее всего, это означает, что файл не был обработан из-за ошибок, и на самом деле никаких изменений не было. Вы должны увидеть список измененных записей. Например, это рабочая версия (с заменой, а не с добавлением)

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
replace olcTLSCipherSuite:
NORMAL
replace olcTLSCRLCheck:
none
replace olcTLSVerifyClient:
never
replace olcTLSCertificateFile:
/etc/ssl/certs/ldap2-ca-cert.pem
replace olcTLSCertificateKeyFile:
/etc/ssl/private/ldap2-ca-key.pem
modifying entry "cn=config"
modify complete

ШАГ ЧЕТВЕРТЫЙ

Убедитесь, что slapd прослушивает соединения ldaps: //. Мы снова отправляемся редактировать файл (кто-нибудь еще думает, что использование cn = config вызывает больше проблем, чем решает?), На этот раз нам нужно отредактировать /etc/default/slapd и измените строку SLAPD_SERVICES так, чтобы она содержала запись ldaps: ///, как показано здесь;

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

ШАГ ПЯТЫЙ.

Устраните проблему с ненадежным сертификатом. Вы могли подумать, что к этому моменту мы закончили, но оказалось, что в другом файле есть одна конфигурация, которая действительно важна. Если вы попытаетесь подключиться сейчас, используя командную строку, которая привязывается к серверу ldap, например:

ldapsearch -d 9 -D “cn=admin,dc=mydomain,dc=com” -w adminpassword -b “dc=mydomain,dc=com” -H “ldaps://mydomain.com” “objectClass=*”

Вы, вероятно, получите;

TLS: peer cert untrusted or revoked (0x42)
TLS: can't connect: (unknown error code).
ldap_err2string
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

Чтобы решить эту проблему, отредактируйте файл /etc/ldap/ldap.conf (обратите внимание, что это не файл slapd.conf - это может немного сбивать с толку) и добавьте одну строку ниже к тому, что, вероятно, является полностью закомментированным файлом; TLS_REQCERT никогда

Теперь должно работать!

Похоже, синтаксис моего файла ssl.ldif неверен. Следуя другому руководству в Интернете, я изменил его на это (а также восстановил самозаверяющие сертификаты).

dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: NORMAL
-
add: olcTLSCRLCheck
olcTLSCRLCheck: none
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/new-ca-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/new-ca-key.pem

Это еще не решило ее полностью, но, по крайней мере, теперь я могу использовать;

openssl s_client -connect mydomain.com:636 -showcerts

И реально получить результат. Я обновлю этот ответ, когда узнаю больше.

РЕДАКТИРОВАТЬ:

Я написал свое решение на http://rogermoffatt.com/2011/08/24/ubuntu-openldap-with-ssltls/ который может помочь кому-то другому. Такая болтовня!