Назад | Перейти на главную страницу

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

Я хочу принудительно выполнить проверку 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;                                                                                                                                                     
} 

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

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

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

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

ssl_verify_client optional;

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

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

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

Вам необходимо обновить как минимум до 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.

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

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

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

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

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

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

listen 443 ssl default_server;