Aller au contenu
ecdsa.com
OpenSSL (server side, mutual TLS)CLI OpenSSL

Message d’erreur

SSL routines:tls_process_client_certificate:peer did not return a certificate

Également affiché sous la forme

  • error:0A0000C7:SSL routines::peer did not return a certificate

OpenSSL 3.x consigne « error:0A0000C7:SSL routines:tls_process_client_certificate:peer did not return a certificate:<source> ». nginx ne passe pas par ce chemin : avec ssl_verify_client on, il mène le handshake à terme et renvoie à la place une réponse HTTP 400 « No required SSL certificate was sent ».

OpenSSL (server side, mutual TLS) — SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE

Ce que cela signifie

C’est la trace, côté serveur, d’un handshake TLS mutuel qui a échoué : le serveur exigeait un certificat client (SSL_VERIFY_FAIL_IF_NO_PEER_CERT) et le client n’en a envoyé aucun. Le serveur interrompt alors le handshake par une alerte (certificate_required en TLS 1.3, handshake_failure en TLS 1.2), que le client voit comme une erreur d’alerte.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Configurer le certificat client

    Fournissez au client son certificat et sa clé, puis testez avec curl --cert/--key.

    bash
    # Test from the client side with a certificate
    curl --cert client.pem --key client.key https://mtls.example.com/
  2. 2.

    Rendre le certificat facultatif là où c’est nécessaire

    Les serveurs qui répondent aussi aux contrôles d’intégrité ou servent des chemins publics peuvent demander les certificats de façon facultative et les exiger bloc location par bloc location.

    text
    # nginx: request but do not require a certificate on paths that must stay open (health checks)
    ssl_verify_client optional;
    location /internal/ {
        if ($ssl_client_verify != SUCCESS) { return 403; }
    }
  3. 3.

    Vérifier les noms d’AC annoncés

    L’émetteur des certificats clients doit figurer dans la liste envoyée par le serveur, sinon les clients qui sélectionnent automatiquement un certificat n’en proposeront aucun.

    bash
    # The CA list the server advertises must include the issuer of the client certificates
    openssl s_client -connect mtls.example.com:443 -servername mtls.example.com </dev/null 2>/dev/null \
      | sed -n '/Acceptable client certificate CA names/,/^Requested/p'

Erreurs associées

Parcourir toute la base de données des erreurs de signature