ОПЕРАЦИОННЫЕ СИСТЕМЫ: CentOS 7
SW: NginX
Существующий материал
Проблема:
Я пытаюсь создать проверку клиента, создав сертификаты клиентов, а затем аутентифицировать запросы одного сервера с помощью NginX на моем конечном сервере. Однако я постоянно получаю 400 Bad Request - No required SSL certificate was sent
сообщение об ошибке. Что я делаю не так? Вот что я сделал:
openssl genrsa -out client.key 4096
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -sha256 -in client.csr -CA mydomain.com.crt -CAkey client.key -set_serial 2 -out client.crt
Каждая команда выполняется успешно, однако ошибка остается. Также в моем 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 и сертификат:
Создать клиентский ключ и CSR
Подписать клиентский CSR с помощью файлов CA
ДОПОЛНИТЕЛЬНО: преобразовать client.crt в pem с кодировкой base64, включая закрытый ключ
ОГРОМНОЕ ПРИМЕЧАНИЕ! Название организации для файлов CA и файлов клиента НЕ МОЖЕТ БЫТЬ РАВНО! В противном случае он сломается и не сможет пройти аутентификацию.
Надеюсь, я помог другим, которые тоже были такими же тупыми, как и я.