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

Сертификация клиента SSL

ОПЕРАЦИОННЫЕ СИСТЕМЫ: CentOS 7

SW: NginX

Существующий материал

Проблема:

Я пытаюсь создать проверку клиента, создав сертификаты клиентов, а затем аутентифицировать запросы одного сервера с помощью NginX на моем конечном сервере. Однако я постоянно получаю 400 Bad Request - No required SSL certificate was sent сообщение об ошибке. Что я делаю не так? Вот что я сделал:

Каждая команда выполняется успешно, однако ошибка остается. Также в моем NginX на конечном сервере у меня есть:

ssl_certificate         /etc/nginx/ssl/mydomain.com.crt;
ssl_certificate_key     /etc/nginx/ssl/mydomain.com.key;
ssl_client_certificate  /etc/nginx/ssl/mydomain.com.crt;

Конфигурация NGINX:

server {
    listen 80;
    listen 443 ssl;

    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    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";

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

    ssl_certificate         /etc/nginx/ssl/mydomain.com.crt;
    ssl_certificate_key     /etc/nginx/ssl/mydomain.com.key;
    ssl_client_certificate  /etc/nginx/ssl/client.crt;

    ssl_verify_client optional;

    server_name uploads.mydomain.com;
    root /var/www/html/com.mydomain.uploads/public;

    error_log /var/log/nginx/mydomain.com/error.log;
    access_log /var/log/nginx/mydomain.com/access.log main;

    index index.php;

    rewrite ^/index\.php?(.*)$ /$1 permanent;

    location / {
        try_files $uri @rewrite;
    }

    location @rewrite {
        rewrite ^(.*)$ /index.php/$1 last;
    }

    location ~ ^/index.php(/|$) {
        fastcgi_pass unix:/var/run/php-fpm/uploads.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SSL_CLIENT_VERIFY    $ssl_client_verify;
        fastcgi_param SSL_CLIENT_S_DN       $ssl_client_s_dn;
    }
}

Это была очень глупая ошибка, и теперь мне стыдно за себя.

Я подумал, что сертификаты веб-сайтов такие же, как и сертификаты CA. Итак, теперь я создал новые файлы ca.key и ca.crt, подписал ими сертификат клиента и вуаля. :(

ssl_certificate /etc/nginx/ssl/mydomain.com.crt; ssl_certificate_key /etc/nginx/ssl/mydomain.com.key; ssl_client_certificate /etc/nginx/ssl/ca.crt;

Итак, все команды по порядку:

Создайте ключ CA и сертификат:

  • openssl req -x509 -nodes -days 365 -newkey rsa: 2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt

Создать клиентский ключ и CSR

  • openssl genrsa -out client.key 2048
  • openssl req -new -key client.key -out client.csr

Подписать клиентский CSR с помощью файлов CA

  • openssl x509 -req -days 3652 -sha256 -in client.csr -CA nginx-selfsigned.crt -CAkey nginx-selfsigned.key -set_serial 2 -out client.crt

ДОПОЛНИТЕЛЬНО: преобразовать client.crt в pem с кодировкой base64, включая закрытый ключ

  • openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
  • openssl pkcs12 -в client.p12 -out client.pem -nodes

ОГРОМНОЕ ПРИМЕЧАНИЕ! Название организации для файлов CA и файлов клиента НЕ МОЖЕТ БЫТЬ РАВНО! В противном случае он сломается и не сможет пройти аутентификацию.

Надеюсь, я помог другим, которые тоже были такими же тупыми, как и я.