LINUX.ORG.RU

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


0

1

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

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

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

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

Иерархия должна быть такова:

А это еще нафига? В смысле, это ж совершенно бредовое требование.

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

Насколько я понял из стрелочек, вы клиентский сертификат подписываете ключом сервера, а для этого в политиках применения сертификата сервера должно быть указано подписывание клиентских ключей, такую хрень обычно никто не делает и в примерах команд openssl не указывает. При этом я не уверен, что клиент обязан доверять промежуточному УЦ, которым является сервер, при наличии доверия только к корневому УЦ.

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

Если у клиента есть доверие к корневому центру, то он может построить цепочку к серверному. Как в политиках применения серверного сертификата настроить подписание клиентских?

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

Если у клиента есть доверие к корневому центру, то он может построить цепочку к серверному.

не факт, зависит от клиента

Как в политиках применения серверного сертификата настроить подписание клиентских?

воспользуйтесь документацией к своему УЦ. Но я категорически не рекомендую так делать, ибо утечка ключевой информации сервера, приведёт к печальным последствиям.

пупетообразную поделочку делаете?

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

не факт, зависит от клиента

То есть?

утечка ключевой информации сервера, приведёт к печальным последствиям.

Компрометация корневого УЦ тоже.

пупетообразную поделочку делаете?

Это что такое?

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

То есть?

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

Компрометация корневого УЦ тоже.

корневой УЦ, как правило, либо вообще из сети не доступен, либо очень сильно огорожен, а обычный сервер — выставляют наружу для работы кого-то из сети или интернета с чем-то на этом сервере

Это что такое?

google://puppet

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

Ну тогда смело разрешайте серверу подписывать клиентские ключи, нехай недалёкий препод порадуется.

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

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

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

Я пытался. Но аутентификация не проходит, хотя в атрибутах всех сертификатов все издатели указаны точно.

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

Чтобы было понятнее, выложу куски конфигов для генерации сертификатов.

Секция для подписания сервера

[ v3_ca ]

basicConstraints = critical, CA:true, pathlen:0 nsCertType = sslCA keyUsage = cRLSign, keyCertSign extendedKeyUsage = serverAuth, clientAuth nsComment = «OpenSSL CA Certificate»

Секция для подписания клиента

[ v3_req ] basicConstraints = CA:FALSE keyUsage = cRLSign, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth, clientAuth

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

в глазах рябит, но выглядит всё как надо. Как бы не оказалось, что это фундаментальное ограничение.

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

в смысле, нельзя иметь в одном серте УЦ и политики относящиеся к конечному пользователю, пойду рфц почитаю

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

В результате у меня генерятся 3 сертификата: ca.crt, server.crt, client01.crt (привожу в иерархическом порядке).

Сливаю сертификаты: cat server.crt ca.crt > serverCert.crt

получаю слитый сертификат сервера;

cat client01.crt serverCert.crt> clientCert.crt

получаю слитый сертификат клиента.

В конфиге NGINX прописываю

server{

listen 443;

ssl on;

ssl_certificate /etc/nginx/ssl/Task8/config/serverCert.crt;

ssl_certificate_key /etc/nginx/ssl/Task8/config/server.nopass.key;

ssl_client_certificate /etc/nginx/ssl/Task8/config/serverCert.crt;

ssl_verify_client on;

ssl_session_timeout 5m;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:1m;

ssl_ciphers ALL:!ADH:! EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;

......

}

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

У тебя в политике использования сертификата сервера нет разрешения подписывать сертификаты. Вообще левая идея, но дело хозяйское

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

У тебя в политике использования сертификата сервера нет разрешения подписывать сертификаты

Я прописал basicConstraints = critical, CA:true

Вообще левая идея, но дело хозяйское

Левая идея строить такую иерархию?

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

Я прописал basicConstraints = critical, CA:true

Ну, ты прописал, а в сертификате по факту что?

Левая идея строить такую иерархию?

Ага

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

зачем ты серт уц и серт сервера заливаешь в один файл, если при проверке доверия должен использоваться только серт сервера, с которым ты выпускаешь серт клиента?

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

Ну, ты прописал, а в сертификате по факту что?

x509v3 basicConstraints CA:TRUE

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

А идея не моя, мне дали такое задание.

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

ловко ты заметил в конце дня, хорошо

Это обсуждалось еще в самом начале темы. Я заметил это уже давно. Я пытался сдать работу, в которой сертификаты и сервера, и клиента подписывались сертификатом корневого УЦ. Но получил задание переделать.

Student2209
() автор топика
Ответ на: комментарий от Student2209
/tmp > cat ca.crt server.crt >ca.file

/tmp > openssl verify -CAfile ca.file client01.crt 
client01.crt: OK
/tmp > openssl verify -CAfile ca.crt client01.crt  
client01.crt: C = RU, ST = Moscow, L = Moscow, O = Companyname, OU = User, CN = Client, emailAddress = hehehe.com
error 20 at 0 depth lookup:unable to get local issuer certificate
/tmp > 
vasily_pupkin ★★★★★
()
Ответ на: комментарий от Student2209

cat client01.crt serverCert.crt> clientCert.crt

Это не нужно.

ssl_client_certificate /etc/nginx/ssl/Task8/config/serverCert.crt;

Ага:

This directive specifies the file containing the CA (root) certificate, in PEM format, that is used for validating client certificates.

root, а не intermediate, как у тебя.
И все-таки, откуда такая дурацкая постановка задачи и почему постановщику нельзя, обидно хохоча, пояснить его неправоту?

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

Настроить связку Apache2+Nginx, настроить взаимную аутентификацию на Nginx. Иерархия сертификатов: сертификат корневого CA -> сертификат сервера -> сертификат клиента.

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

препод он

Я думал об этом и теперь все больше склоняюсь к мысли о студенте, который неправильно понял задание.
Кроме того, в природе встречаются (раньше встречались, по крайней мере) вменяемые преподы, которые умели принять указание на собственную неправоту. Ну, обидный хохот, конечно, придется из пояснений исключить.

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

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

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

root, а не intermediate, как у тебя.

И как выходить из ситуации?

пояснить его неправоту

Нужны аргументы. Много веских аргументов. Доводы, что так обычно не делают, могут не сработать.

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

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

Стоит ли этой банковской чувихе выдавать привилегии нагенерить любое количество паспортов с этими же именем и фамилией на любое количество произвольно взятых людей?

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

Ты в коллекцию с клиентским сертификатом CA не забыл положить?

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

Разграничение прав - вот тебе технический довод.
Админ вебсервера в твоей схеме может генерить сертификаты клиентов. А это работа не его, а админа PKI.

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

Не работает.

ssl on; ssl_certificate /etc/nginx/ssl/Task8/config/serverCert.crt; ssl_certificate_key /etc/nginx/ssl/Task8/config/server.nopass.key; ssl_client_certificate /etc/nginx/ssl/Task8/config/ca.crt; ssl_verify_client on;

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