Mensaje de error
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'
También se muestra como
- SSL: certificate subject name (www.example.com) does not match target host name 'git.example.com'
Los nombres entre paréntesis y entre comillas proceden de tu certificado y de tu URL remota. libcurl 7.x imprimía «target host name»; libcurl 8.x imprime «target hostname». Las compilaciones de git con OpenSSL (Git for Windows, Alpine) imprimen «SSL: no alternative certificate subject name matches target hostname '…'».
Qué significa
El certificado del servidor Git es de confianza, pero está emitido para un nombre distinto del host de la URL remota. libcurl-gnutls cita entre paréntesis el nombre del sujeto del certificado y, al final, el host al que se conectó git. No se enviaron credenciales: la conexión se detiene antes de cualquier solicitud HTTP.
Por qué ocurre
El certificado no incluye el nombre del host de Git
frecuenteUn servidor Git que pasó a un nombre nuevo (git.example.com en lugar de gitlab.example.com) o que añadió un segundo nombre sin volver a emitir el certificado.
La URL remota usa un alias o una dirección IP
frecuenteLos clones hechos con un alias interno, una dirección IP o un nombre de host antiguo conservan esa URL en el archivo de configuración .git/config mucho después de que el certificado se emitiera para el nombre canónico.
El proxy situado delante del servidor Git envía su certificado predeterminado
ocasionalUn proxy inverso o un ingress sin regla para el nombre solicitado presenta el certificado de otro host virtual.
Cómo solucionarlo
- 1.
Comparar la URL remota con el certificado
Imprime la URL remota, y el sujeto y la lista SAN del certificado; la discrepancia suele ser evidente.
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.
Apuntar el remoto a un nombre cubierto por el certificado
git remote set-url cambia la URL guardada en la configuración del repositorio sin volver a clonar.
bash # Use the name the certificate was issued for git remote set-url origin https://gitlab.example.com/team/app.git - 3.
Propietarios del servidor: emitir el certificado para el nombre anunciado
Haz que la lista SAN del certificado coincida con la URL que el servidor Git anuncia para clonar (external_url en GitLab, ROOT_URL en Gitea), para que los usuarios copien URL que superen la verificación.
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
Errores relacionados
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