У меня 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