Рейтинг:0

Можно ли проверить TLS, если сервер не предоставляет сертификат издателя?

флаг kz

Я пытаюсь настроить Apache httpd v2.4 для аутентификации LDAP в AD. Сертификаты LDAPS выдаются внутренним ЦС. По какой-то причине (я не в команде AD) ни наши рабочие, ни нерабочие среды не публикуют полную цепочку.

Non-prod отправляет серверные и промежуточные сертификаты, но не корень. Я могу успешно подключиться через Apache с помощью:

LDAPVerifyServerCert Вкл.
LDAPTrustedGlobalCert CA_BASE64 chain.crt
# $cat промежуточный.pem root.pem > chain.crt

К сожалению, prod отправляет только сертификат сервера. Без промежуточного звена (эмитента) и без корня. Предоставление одной и той же цепочки, содержащей эмитента и root, не работает. Я пробовал все, что мог придумать: только сертификат сервера, только int, сервер + int, сервер + int + root, но ничего из этого не работает ни в Apache, ни при тестировании с openssl s_client -connect $x -CAfile $y.

Очевидно, что лучший вариант — заставить команду AD опубликовать всю цепочку, но есть ли другой способ проверить соединение (кроме отключения проверки)?

Редактировать:

Вот результат openssl s_client -connect devldap.company.com:636 -CAfile int+root.pem:

ПОДКЛЮЧЕН(00000003)
depth=2 CN = Корневой ЦС компании
проверить возврат: 1
depth=1 DC = com, DC = компания CN = Company Intermediate CA
проверить возврат: 1
depth=0 C = US, ST = State, O = Company, OU = OTS, CN = devldap.company.com
проверить возврат: 1
---
Цепочка сертификатов
 0 s:C = США, ST = штат, O = компания, OU = OTS, CN = devldap.company.com
   i:DC = com, DC = компания CN = Company Intermediate CA
 1 s:DC = com, DC = компания CN = Company Intermediate CA
   i:CN = Корневой ЦС компании
---
Сертификат сервера
-----НАЧАТЬ СЕРТИФИКАТ-----
MIIH8TCCBtmgAwIBAgITTQACdEm5xkCMTnqGDQAAAAJ0STANBgkqhkiG9w0BAQsF
...
jce8VpEUyZKDClUrcyRBSxd0rq2I
-----КОНЕЦ СЕРТИФИКАТА-----
subject=C = US, ST = State, O = Company, OU = OTS, CN = devldap.company.com

эмитент = DC = com, DC = компания CN = компания Промежуточный CA

---
Имена ЦС сертификата клиента не отправлены
Типы клиентских сертификатов: знак RSA, знак DSA, знак ECDSA
Запрошенные алгоритмы подписи: RSA+SHA256:RSA+SHA384:RSA+SHA1:ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA1:DSA+SHA1:RSA+SHA512:ECDSA+SHA512
Алгоритмы общей запрашиваемой подписи: RSA+SHA256:RSA+SHA384:RSA+SHA1:ECDSA+SHA256:ECDSA+SHA384:ECDSA+SHA1:RSA+SHA512:ECDSA+SHA512
Дайджест одноранговой подписи: SHA256
Тип одноранговой подписи: RSA
Временный ключ сервера: ECDH, P-384, 384 бита
---
SSL-рукопожатие прочитало 4639 байт и записало 486 байт.
Проверка: ОК
---
Новый, TLSv1.2, шифр ECDHE-RSA-AES256-GCM-SHA384.
Открытый ключ сервера 2048 бит.
Поддерживается безопасное повторное согласование IS
Сжатие: НЕТ
Расширение: НЕТ
ALPN не согласован
SSL-сессия:
    Протокол: TLSv1.2
    Шифр: ECDHE-RSA-AES256-GCM-SHA384
    Идентификатор сеанса: F90...411
    Идентификатор сеанса-ctx: 
    Мастер-ключ: 985...D1E
    Идентификация PSK: нет
    Подсказка идентификации PSK: нет
    Имя пользователя SRP: нет
    Время начала: 1651420792
    Время ожидания: 7200 (сек)
    Подтвердите код возврата: 0 (хорошо)
    Расширенный главный секрет: да
---
СДЕЛАНО

И для производства, openssl s_client -connect ldap.company.com:636 -CAfile int+root.pem:

ПОДКЛЮЧЕН(00000003)
depth=0 C = США, ST = Штат, O = Компания, CN = ldap.company.com
ошибка подтверждения: число = 20: невозможно получить сертификат локального эмитента
проверить возврат: 1
depth=0 C = США, ST = Штат, O = Компания, CN = ldap.company.com
ошибка проверки: число = 21: невозможно проверить первый сертификат
проверить возврат: 1
depth=0 C = США, ST = Штат, O = Компания, CN = ldap.company.com
проверить возврат: 1
---
Цепочка сертификатов
 0 s:C = США, ST = штат, O = компания, CN = ldap.company.com
   i:DC = com, DC = компания CN = Company Intermediate CA
---
Сертификат сервера
-----НАЧАТЬ СЕРТИФИКАТ-----
MIIHXzCCBkegAwIBAgITTQADO1BEj8rlaKH+eQAAAAM7UDANBgkqhkiG9w0BAQsF
...
FGBKggzc3AK2pcHT9E3f46Oy+A==
-----КОНЕЦ СЕРТИФИКАТА-----
subject=C = США, ST = штат, O = компания, CN = ldap.company.com

эмитент = DC = com, DC = компания CN = компания Промежуточный CA

---
Имена ЦС сертификата клиента не отправлены
---
Рукопожатие SSL прочитало 2059 байт и записало 655 байт
Ошибка проверки: не удалось проверить первый сертификат
---
Новый, SSLv3, шифр AES256-SHA
Открытый ключ сервера 2048 бит.
Безопасное повторное согласование НЕ поддерживается
Сжатие: НЕТ
Расширение: НЕТ
ALPN не согласован
SSL-сессия:
    Протокол: TLSv1.2
    Шифр: AES256-SHA
    Идентификатор сеанса: 33B...377
    Идентификатор сеанса-ctx: 
    Мастер-ключ: A5D...ACE
    Идентификация PSK: нет
    Подсказка идентификации PSK: нет
    Имя пользователя SRP: нет
    Время начала: 1651420815
    Время ожидания: 7200 (сек)
    Код возврата проверки: 21 (невозможно проверить первый сертификат)
    Расширенный главный секрет: нет
---
СДЕЛАНО

Редактировать: Оказывается, файл с именем «int.pem» на самом деле был сертификатом сервера из другого проекта. Неато. Хотел бы я проверить это, прежде чем тратить на это столько времени. С цепочкой, содержащей фактический промежуточный сертификат CA и корень, он проходит успешную проверку.

dave_thompson_085 avatar
флаг jp
Серверам TLS разрешено (а иногда и рекомендуется) не указывать корневой сертификат; ваш непроизводственный случай является нормальным и должен работать с (только) root в `LDAPTrustedGlobalCert CA*`. OpenSSL по умолчанию может заполнять цепочку из хранилища доверенных сертификатов, а `openssl s_client -connect $prod:636 -CAfile int_and_root.pem` (если openssl ниже 1.1.1 _and_ server хочет SNI, которого я не знаю для MS, добавьте `- имя сервера $prod`) должно работать; если нет, то можно подробности? Но хотя Apache использует OpenSSL для https, мне не ясно, использует ли (и как) он OpenSSL для ldaps, так что это может не помочь.
Joe Buckley avatar
флаг kz
@dave_thompson_085 Я добавил вывод s_client в сообщение. Не могли бы вы взглянуть еще раз?
Joe Buckley avatar
флаг kz
@dave_thompson_085 Большое спасибо! К сожалению, это была ошибка пользователя с моей стороны. Каким-то образом я поклялся, что промежуточный сертификат был на самом деле сертификатом сервера для чего-то совершенно другого. Создал новый .pem с фактическим int + root, и он проверяет и также работает в Apache.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.