Certificação do cliente SSL

3

SO: CentOS 7

SW: NginX

Material existente

  • dhparam.pem
  • mydomain.com.crt
  • mydomain.com.csr
  • mydomain.com.key

Problema:

Estou tentando criar uma verificação de cliente criando certificados de cliente e, em seguida, autentico solicitações de um servidor com o NginX em meu servidor de destino. No entanto, recebo constantemente a mensagem de erro 400 Bad Request - No required SSL certificate was sent . O que estou fazendo de errado? Aqui está o que eu fiz:

  • openssl genrsa -out client.key 4096

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

  • openssl x509 -req -days 365-sha256 -em client.csr -CA mydomain.com.crt -CAkey client.key -set_serial 2 -out client.crt

Todo comando é executado com sucesso, no entanto, o erro permanece. Também no meu NginX, no servidor de destino, eu tenho:

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;

Configuração do 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;
    }
}
    
por Bert 27.06.2018 / 09:54

1 resposta

2

Foi um erro muito estúpido e agora eu tenho vergonha de mim mesmo.

Acredito que os certificados do website sejam os mesmos que os da CA. Então agora eu criei novos arquivos ca.key e ca.crt e assinei o certificado do cliente com eles e voila. : (

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;

Então todos os comandos em ordem:

Crie a chave e o certificado da CA:

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

Criar chave do cliente e CSR

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

Assinar o CSR do cliente com arquivos CA

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

OPCIONAL: converta client.crt em um pem codificado em base64 incluindo a chave privada

  • openssl pkcs12 -export -clercts -em client.crt -inkey client.key -out client.p12
  • openssl pkcs12 -no cliente.p12 -out client.pem -nodes

ENORME NOTA! O nome da organização dos arquivos CA e dos arquivos do cliente NÃO PODE SER IGUAL! Caso contrário, ele irá quebrar e falhar na autenticação.

Espero ter ajudado os outros que também são tão burros quanto eu.

    
por 28.06.2018 / 14:09