Как использовать ssl_verify_client = ON на одном виртуальном сервере и ssl_verify_client = OFF на другом?

9

Я хочу принудительно подтвердить ssl-клиент на одном из моих виртуальных хостов. Но получите сообщение «Не требуется сертификат SSL был отправлен», пытаясь получить что-то из него.

Вот мои тестовые конфигурации:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

Первый сервер отвечает HTTP-кодом 200, а второй возвращает «400 Bad Request, не был отправлен обязательный сертификат SSL, nginx / 1.0.4».

Возможно, нельзя использовать ssl_verify_client на том же IP? Должен ли я связать эти серверы с разными IP-адресами, это решит мою проблему?

Александр Артеменко
источник

Ответы:

4

Я столкнулся с подобной проблемой, но пытался различить ssl_verify_clientsблоки местоположения внутри блока сервера, а не между блоками сервера. Вероятно, вы могли бы решить вашу проблему, переместив стандартную конфигурацию ssl на два сервера (точно продублируйте ее или поместите все в один блок сервера, примите несколько поддоменов и используйте местоположения).

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

ssl_verify_client optional;

в блоке сервера и используйте операторы if в различных местах, например:

if ($ssl_client_verify != SUCCESS) { return 403; }

Мне нужно было сделать это, чтобы предоставить администратору доступ к веб-приложению, но при этом разрешить веб-заезды с github, не предоставляя github клиентский сертификат ssl.

Итан
источник
2

Необходимо обновить хотя бы до nginx> = 1.0.9, если вы хотите иметь несколько виртуальных хостов на основе имен (используя SNI) на одном IP-адресе и порте, но с разными ssl_verify_clientнастройками для этих хостов.

В более старых версиях nginx ssl_verify_clientпараметр для виртуального хоста по умолчанию использовался для всех других виртуальных хостов на основе имен с той же комбинацией IP + порт. Некоторые другие параметры SSL ( ssl_verify_depth, ssl_prefer_server_ciphers) также обрабатывались таким же образом. Использование отдельного IP-адреса или порта может стать обходным решением, если вы абсолютно не можете выполнить обновление.

Примечание из журнала изменений nginx для 1.0.9:

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Соответствующие изменения в источнике nginx: r4034 в транке , r4246 в ветке 1.0.

Сергей Власов
источник
0

Вы загрузили в свой браузер сертификат клиента (в формате PKCS12), подписанный центром сертификации «/etc/certs/allcas.pem»? В Firefox вы можете проверить сертификаты своих клиентов, перейдя в «Настройки» -> «Дополнительно» -> «Шифрование» -> «Просмотр сертификатов» -> «Ваши сертификаты».

Значение параметра «ssl_verify_client», если «выключено» по умолчанию. Вы также можете использовать значение «необязательно», если SSL-сертификат клиента не является обязательным.

user1025596
источник
Я использовал curl --cert ... с такими же результатами.
Александр Артеменко
Есть ли что-нибудь интересное в журнале ошибок nginx? (вероятно, /var/log/nginx/error.log)
user1025596
0

Я не эксперт по nginx, но я видел похожие проблемы с Apache, использующим SSL и виртуальные хосты. Проблема заключается в порядке, в котором сервер обрабатывает согласование SSL по сравнению с выбором виртуального хоста. Первый шаг - установить зашифрованное соединение, и только после этого сервер увидит, какое имя хоста вы запрашиваете. И до тех пор, пока он не узнает, он будет использовать настройку по умолчанию, которая в данном случае является первым хостом, для которого требуется сертификат клиента для установления соединения SSL.

Итак, короткий ответ - в этом случае вам лучше иметь либо отдельные порты, либо отдельные IP-адреса.

Дженни Д
источник
-1

Я столкнулся с той же проблемой и нашел решение.

Пожалуйста, попробуйте добавить default_serverфлаг для второго сервера

listen 443 ssl default_server;
yfliu
источник