LINUX.ORG.RU

Взаимная аутентификация на NGINX (OpenSSL).


0

1

Доброго времени суток.

Стоит задача: настроить взаимную аутентификацию на NGINX посредством SSL-сертификатов. Иерархия должна быть такова: сертификат корневого CA -> сертификат сервера -> сертификат клиента.

Сами сертификаты генерятся без проблем. Цепочка соблюдена, назначения сертификатов правильные. Но при попытке авторизоваться выдает ошибку 400. Если делать так, что и серверный сертификат, и сертификат клиента подписаны корневым CA, то все работает. Но мне то не так надо.

Кто-нибудь что-нибудь может подсказать?

Ответ на: комментарий от Student2209

чото у сервера в key usage и extended key usage не написано про подписывание сертов и списков отзыва.

anonymous
()
Ответ на: комментарий от Student2209

Из файла клиентского сертификата сертификат CA выбросил уже?

А их можно совместить?

Неправильно поставлн вопрос. Правильный вопрос звучит так: «нужно ли иметь возможность при первой необходимости легко разделить эти роли?»

thesis ★★★★★
()
Ответ на: комментарий от Student2209

А их можно совместить?

это мыслепреступление, за вами выехал наряд полиции здравого смысла

anonymous
()
Ответ на: комментарий от anonymous

чото у сервера в key usage и extended key usage не написано про подписывание сертов и списков отзыва

Если смотреть в Винде, то выдает:

Использование ключа: Подписывание сертификатов, Автономное подписание списка отзыва (CRL), Подписывание списка отзыва (CRL) (06);

улучшенный ключ: Проверка подлинности сервера (1.3.6.1.5.5.7.3.1) Проверка подлинности клиента (1.3.6.1.5.5.7.3.2)

Student2209
() автор топика
Ответ на: комментарий от Student2209

поглядел в openssl x509 — есть, это убунтовая смотрелка косячит. Но всё равно, openssl verify проверяет валидность server.crt по ca.crt, и ругается на поверку client01.crt как по серту УЦ так и по серту сервера. Может быть он выпущен неправильно?

Ещё раз напомню, что проверять доверие самому себе нельзя.

anonymous
()
Ответ на: комментарий от anonymous

ругается на поверку client01.crt как по серту УЦ так и по серту сервера

Я собрал клиентский сертификат cat client01.crt server.crt ca.crt > clientcert.crt и проверка прошла успешно.

Student2209
() автор топика
Ответ на: комментарий от Student2209

Я собрал клиентский сертификат

вообще, таким способом можно собрать цепочку для проверки клиентского серта, и она даже работает, то есть cat server.crt ca.crt > shit.crt дадут возможность проверить client01.crt, осталось понять, почему нжинкс не может проверить доверие ежели openssl проверяет

anonymous
()
Ответ на: комментарий от Student2209

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

anonymous
()
Ответ на: комментарий от anonymous

Есть момент: если «чистый» клиентский сертификат проверить в openssl verify связкой корневой УЦ + серверный, то проверка не проходит. Если брать связку клиент+сервер, то тоже неудачно. А вот если составить полную цепочку клиент+сервер+УЦ, то проверка проходит успешно.

Student2209
() автор топика
Ответ на: комментарий от anonymous

её самую, а не клиентский серт

Через curl я и проверяю сразу цепочку.

Student2209
() автор топика
Ответ на: комментарий от Student2209

у меня проходит:

openssl verify -CAfile shit.crt client01.crt 
client01.crt: OK
в shit.crt запихнут серт сервера и уц, все файлы скачаны по ссылкам выше

anonymous
()
Ответ на: комментарий от anonymous

Согласен, у меня тоже прошло. Случайно не в том порядке подал сертификаты.

Student2209
() автор топика
Ответ на: комментарий от Student2209

а как именно он не пропускает? мож это на самом деле curl серверу не доверяет и ему надо тоже показать цепочку доверия?

anonymous
()
Ответ на: комментарий от anonymous

мож это на самом деле curl серверу не доверяет и ему надо тоже показать цепочку доверия?

curl -k --key /etc/nginx/ssl/Task8/config/client01.key --cert /etc/nginx/ssl/Task8/config/cl1.crt --url "https://lifelongjourney.ru"

cl1.crt - цепочка client01.crt server.crt ca.crt

Выдает ошибку 400 Bad Request.

Student2209
() автор топика
Ответ на: комментарий от anonymous

Если подписать серверный и клиентский сертификаты сертификатом корневого УЦ, то проверка Nginx проходит, но только если подать полую цепочку сертификатов клиент+сервер+УЦ. Просто клиент или клиент+сервер не проходит.

Student2209
() автор топика

Странная задача ибо nginx позволяет (apache по идее это тоже должен уметь, но не тестировал):

а) обеспечивать надежное шифрование когда имеется внешний СА

б) внешний CA предоставляет подписанный серверный сертификат (server.crt) без разрешения подписывать клиентские сертификаты (client.crt), но имеется policy на проверку сервера/клиента

б) CRL-список (list.crl)/клиентские сертификаты (client.crt) могут быть сгенерированы и подписаны собственным, локальным, CA и корректно проходить валидацию, т.к. у nginx для этого есть специальные дерективы для этого ssl_crl и ssl_client_certificate

Таким образом, в сети продаются недорогие сертификаты, которые многих устраивают. В конечно виде конфиг примерно такой:

# все что подписанно внешним СА (читай купленно по-дешевке)
ssl_certificate      /etc/nginx/cert.crt;
ssl_certificate_key  /etc/nginx/cert.key;

#локально сгенерированная часть
ssl_client_certificate /etc/nginx/ca.pem;
ssl_crl /etc/nginx/crl.pem;

#включаем проверку клиента
ssl_verify_client on;

#подстраиваем количество уровней валидаций сертификатов
ssl_verify_depth 2;

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

И схема, раз тут их так любят:

[ CA1 ] -- [ CA2 ]                 [ local CA ]
              |                          |
              |                          |
       [ server.crt ]             +------+---+--------+
                                  |          |        |
                               [ cli_1]  [ cli_2 ] [ cli_3 ]
                                          

P.S. Если не прав (у меня так работает) — отпишитесь.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

В конечно виде конфиг примерно такой:

Спасибо, заработало.

А всего-то надо было прописать

#подстраиваем количество уровней валидаций сертификатов
ssl_verify_depth 2;

Student2209
() автор топика
Ответ на: комментарий от Student2209

Давно было. Всю историю потерял, пришлось разбираться. Много выяснил.

Каким сертификатом в вашем примере localCA подписывает клиентов?

Локальным. Сгенерированный на своем сервере. Сертификаты, которые обеспечивают шифрование, т.е. подписали server.crt никак с этим процессом не связаны.

Документация, рабочие скрипты здесь. Скрипты прошли обфускацию, может где-то опечатался — сообщите.

live-тестирование:

gh0stwizard ★★★★★
()

Будет ли манул (или копипаста команд) выложен? А то Вам помогали, а для истории (и поиска) ничего не останется.

ktulhu666 ☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.