Message d’erreur
fatal: unable to access 'https://git.example.com/team/app.git/': SSL: certificate subject name (www.example.com) does not match target hostname 'git.example.com'
Également affiché sous la forme
- SSL: certificate subject name (www.example.com) does not match target host name 'git.example.com'
Les noms entre parenthèses et entre apostrophes proviennent de votre certificat et de l’URL de votre dépôt distant. libcurl 7.x affichait « target host name », libcurl 8.x affiche « target hostname ». Les builds de git reposant sur OpenSSL (Git for Windows, Alpine) affichent « SSL: no alternative certificate subject name matches target hostname '…' ».
Ce que cela signifie
Le certificat du serveur Git est approuvé, mais il a été émis pour un autre nom que l’hôte de l’URL du dépôt distant. libcurl-gnutls cite entre parenthèses le nom du sujet du certificat et, à la fin du message, l’hôte auquel git s’est connecté. Les identifiants n’ont pas été envoyés : la connexion s’arrête avant toute requête HTTP.
Pourquoi cela se produit
Le certificat ne mentionne pas le nom de l’hôte Git
fréquenteUn serveur Git a changé de nom (git.example.com au lieu de gitlab.example.com) ou a ajouté un second nom sans que le certificat soit réémis.
L’URL du dépôt distant utilise un alias ou une adresse IP
fréquenteLes clones réalisés avec un alias interne, une adresse IP ou un ancien nom d’hôte conservent cette URL dans .git/config longtemps après l’émission du certificat pour le nom canonique.
Le proxy placé devant le serveur Git envoie son certificat par défaut
occasionnelleUn proxy inverse ou un ingress sans règle pour le nom demandé présente le certificat d’un autre hôte virtuel.
Comment corriger l’erreur
- 1.
Comparer l’URL du dépôt distant avec le certificat
Affichez l’URL du dépôt distant ainsi que le sujet et la liste des SAN du certificat ; l’écart saute généralement aux yeux.
bash git remote get-url origin echo | openssl s_client -connect git.example.com:443 -servername git.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName - 2.
Faire pointer le dépôt distant vers un nom couvert par le certificat
git remote set-url modifie l’URL enregistrée dans la configuration du dépôt, sans nouveau clone.
bash # Use the name the certificate was issued for git remote set-url origin https://gitlab.example.com/team/app.git - 3.
Propriétaires de serveurs : émettre le certificat pour le nom annoncé
Faites correspondre la liste des SAN du certificat à l’URL que le serveur Git annonce pour les clones (external_url de GitLab, ROOT_URL de Gitea), afin que les utilisateurs copient des URL qui passent la vérification.
text # GitLab Omnibus: the external URL decides the certificate name and the clone URLs external_url "https://git.example.com" # then: sudo gitlab-ctl reconfigure
Erreurs associées
curl: (60) SSL: no alternative certificate subject name matches target hostname…curl (OpenSSL backend)fatal: unable to access 'https://git.example.com/team/app.git/': server verific…git over HTTPS with libcurl-gnutls (Debian, Ubuntu)The certificate's owner does not match hostname 'api.example.com'GNU Wget (GnuTLS build); the alias is the OpenSSL build's wording