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

NGINX не запрашивает сертификат SSL клиента

В нашей настройке мы хотим предложить пользователю клиентский ssl-сертификат. Все сертификаты выдаются StartSSL.

Проблема в том, что хотя ssl_verify_client on; установлен "on", веб-сайт / браузер не запрашивает сертификат.

Как я могу заставить NGINX запрашивать сертификат клиента?

Это связано с этот вопрос без ответа.

версия nginx: nginx / 1.9.11

Наш конфиг для сервера:

server {
  listen 80;
  server_name example.com;
  # enforce https
  return 301 https://$server_name$request_uri;
  }

server {
  listen 443 ssl http2;
  server_name example.com;

  # strenghen ssl security
  ssl_certificate SOMECERT;
  ssl_certificate_key SOMEKEY;
  ssl_client_certificate SOMECERT;
  ssl_verify_client on;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
  ssl_dhparam SOMEPARAM;

  # allow longer uri
  client_header_buffer_size 256k;
  large_client_header_buffers 8 1024k;

  # Add headers to serve security related headers
  add_header Strict-Transport-Security "max-age=15768000; preload;";
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Robots-Tag none;

  root /var/www/SOMEFOLDER;
  index index.php;

  client_max_body_size 1G;
  client_body_timeout 600s;

  # only allow clients with valid client ssl certificate
  if ($ssl_client_verify != SUCCESS) {
   return 403;
}

  location ~* \.php$ {
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 600;
  }
 }

Пару дней назад я боролся с той же проблемой и, наконец, исправил свою проблему сегодня. Моя проблема заключалась в том, что я неправильно установил сертификат клиента в Chrome.

Я выполнил следующие шаги, чтобы настроить взаимную аутентификацию TLS, и изначально cURL работал без каких-либо проблем: http://nategood.com/client-side-certificate-authentication-in-ngi

Затем я продолжил установку client.crt в моем браузере для аутентификации клиента. Здесь я ошибся. Сам подписанный сертификат X.509 не содержит закрытого ключа клиента, и, следовательно, браузер не распознает его как допустимое средство аутентификации клиента. Клиент должен знать закрытый ключ, чтобы доказать, что он владеет сертификатом X.509, который он предоставляет серверу.

Итак, я создал файл PKCS12, который объединил сертификат клиента X.509 и закрытый ключ, и установил его в браузере. Затем я перезапустил браузер и сервер nginx. На этот раз Chrome предложил мне выбрать настроенный профиль PKCS12, и IE подобрал его автоматически.

Вот пример того, как создать профиль PKCS12: https://www.tbs-certificates.co.uk/FAQ/en/288.html

Кажется, что Firefox находится в своем собственном странном мире, потому что он не может импортировать тот же профиль PKCS12, который работал с IE и Chrome.

Надеюсь это поможет.