4 votes

Certification du client SSL

OS : CentOS 7

SW : NginX

Matériel existant

  • dhparam.pem
  • mondomaine.com.crt
  • mondomaine.com.csr
  • mondomaine.com.clé

Question :

J'essaie de créer une vérification du client en créant des certificats de client, puis d'authentifier les demandes d'un serveur avec NginX vers mon serveur de destination. Cependant, je reçois constamment le message 400 Bad Request - No required SSL certificate was sent message d'erreur. Qu'est-ce que je fais de mal ? Voici ce que j'ai fait :

  • 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

Toutes les commandes s'exécutent avec succès, mais l'erreur persiste. De plus, dans mon NginX, sur le serveur de destination, j'ai :

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;

Configuration de 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;
    }
}

0 votes

Pouvez-vous nous montrer le reste du fichier de configuration ? En particulier le bloc serveur.

2 votes

Le message d'erreur indique que le client n'a pas envoyé de certificat client. Puisque vous ne montrez pas comment vous avez ajouté un tel certificat client au client, je suppose que vous ne l'avez pas fait du tout. Dans ce cas, il n'est pas étonnant que le serveur se plaint d'un certificat manquant du client.

3voto

Bert Points 974

C'était une erreur très stupide et maintenant j'ai honte de moi.

Je pensais que les certificats du site web étaient les mêmes que ceux de l'AC. J'ai donc créé de nouveaux fichiers ca.key et ca.crt et j'ai signé le certificat du client avec ces fichiers.

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;

Donc toutes les commandes en ordre :

Créez la clé et le certificat CA :

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

Créer une clé client et un CSR

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

Signer le CSR du client avec les fichiers de l'AC

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

OPTIONNEL : Convertir client.crt en un pem encodé base64 incluant la clé privée

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

ÉNORME NOTE ! Le nom de l'organisation des fichiers de l'AC et des fichiers du client ne peut pas être le même ! Sinon, l'authentification échouera.

J'espère avoir aidé d'autres personnes aussi stupides que moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X