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
Aucun certificat n’est configuré sur le client
fréquenteUn nouveau déploiement, un secret renouvelé qui n’est pas parvenu jusqu’au client, ou une bibliothèque à laquelle on n’a pas fourni son certificat et sa clé.
Contrôles d’intégrité des répartiteurs de charge et surveillance
fréquenteLes sondes de contrôle d’intégrité se connectent généralement sans certificat client ; sur un serveur qui en exige un pour chaque connexion, elles produisent un flot continu de ces lignes.
Le client n’a trouvé aucun certificat correspondant à la liste d’AC du serveur
occasionnelleLes navigateurs et certaines bibliothèques ne proposent qu’un certificat émis par l’une des AC annoncées par le serveur ; sinon, ils envoient un message de certificat vide.
Comment corriger l’erreur
- 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.
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.
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'