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

SSL-аутентификация клиента Nginx

У меня Nginx работает исключительно как прокси для различного количества веб-серверов. Один из наших клиентов попросил нас использовать клиентские сертификаты и предоставил нам 3 сертификата для 3 разных машин, которые будут подключаться к веб-сервису, работающему на одном из прокси-серверов.

Никогда не делал этого, я нашел соответствующие настройки nginx и создал конфигурацию сайта (соответствующая часть ниже)

      server {
        listen                  443 ssl; 
        server_name             service.domain.com;
        ssl_certificate         /etc/nginx/ssl/wildcard/server.crt; 
        ssl_certificate_key     /etc/nginx/ssl/wildcard/server.key; 
        ssl_client_certificate  /etc/nginx/ssl/client.certificates/client_package.cer;
        ssl_verify_client on;

Я объединил 3 клиентских сертификата плюс сертификат, созданный разработчиком (этот был самоподписанным), который нуждался в доступе к сайту во время разработки, в один файл, упомянутый выше.

Теперь клиент попытался получить доступ к сайту, но не может этого сделать. В качестве теста конфигурации я удалил сертификат разработчика из объединенного файла сертификата и подтвердил, что он не может получить доступ к сайту. После того, как я добавил его сертификат обратно в составной файл, он (разработчик) снова смог правильно получить доступ к сайту.

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

2015/08/13 11:57:41 [info] 27601 # 0: * 1963 клиент не отправил требуемый сертификат SSL при обработке SPDY, клиент: 1x.xx.xx.xx, сервер: service.domain.com, запрос: " ПОЛУЧИТЬ /test.cfm HTTP / 1.1 ", хост:" service.domain.com "

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

Что касается сертификатов, которые были мне отправлены: все 3 подписаны одним и тем же публичным центром сертификации. Однако у меня нет всей цепочки в объединенном файле. В каких руководствах, которые я нашел в Интернете, также упоминается наличие корневого CA, но все они говорят о самоподписанных, чего нет ни у кого из них. Так что я не уверен, что это применимо.

Чтобы уточнить, я также не пытаюсь передать сертификат клиента на прокси-сервер.

версия nginx: nginx / 1.8.0
версия openssl: OpenSSL 1.0.1k 8 января 2015 г.

Если потребуется дополнительная информация, дайте мне знать

Ваша конфигурация действительно верна. Однако убедитесь, что вы НЕ помещаете действительные сертификаты клиентов в client_package.cer файл. Этот файл должен содержать только доверенные сертификаты CA, фактически он должен содержать полную цепочку (и). Вам следует запросить все корневые и промежуточные сертификаты у своего клиента, если он их не предоставил.

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

Использовать ssl_trusted_certificate директива вместо ssl_client_certificate. См. Документы http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate .

Но в любом случае я бы рекомендовал подписывать все клиентские сертификаты с помощью ONE ROOT CA и проверьте, подписан ли сертификат клиента этим ЦС.

Если это решило вашу проблему, примите это как ответ.

SSL-сертификаты являются подстановочными или однодоменными? Возможно, разработчик пытается получить доступ к URL-адресу веб-сайта, например test.myapp.com, но сертификат выдается только для myapp.com или www.myapp.com