Я просто не могу заставить это (соединение 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/ который может помочь кому-то другому. Такая болтовня!