Mensagem de erro
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'
Também aparece como
- SSL: certificate subject name (www.example.com) does not match target host name 'git.example.com'
Os nomes entre parênteses e entre aspas vêm do seu certificado e da URL do seu remoto. A libcurl 7.x imprimia “target host name”; a libcurl 8.x imprime “target hostname”. Builds do git com OpenSSL (Git for Windows, Alpine) imprimem “SSL: no alternative certificate subject name matches target hostname '…'”.
O que significa
O certificado do servidor Git é confiável, mas foi emitido para um nome diferente do host na URL do remoto. A libcurl-gnutls cita entre parênteses o nome do titular do certificado e, no final, o host ao qual o git se conectou. Nenhuma credencial foi enviada: a conexão é interrompida antes de qualquer requisição HTTP.
Por que acontece
O certificado não lista o nome do host Git
comumUm servidor Git passou a usar um novo nome (git.example.com em vez de gitlab.example.com) ou ganhou um segundo nome sem que o certificado fosse reemitido.
A URL do remoto usa um alias ou um endereço IP
comumClones feitos com um alias interno, um endereço IP ou um nome de host antigo mantêm essa URL no .git/config muito tempo depois de o certificado ter sido emitido para o nome canônico.
O proxy na frente do servidor Git envia o certificado padrão dele
ocasionalUm proxy reverso ou ingress sem regra para o nome solicitado apresenta o certificado de outro host virtual.
Como corrigir
- 1.
Comparar a URL do remoto com o certificado
Imprima a URL do remoto, o titular do certificado e a lista de SANs; a divergência costuma ser óbvia.
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.
Apontar o remoto para um nome que o certificado cobre
O git remote set-url altera a URL salva na configuração do repositório sem precisar clonar de novo.
bash # Use the name the certificate was issued for git remote set-url origin https://gitlab.example.com/team/app.git - 3.
Donos do servidor: emitir o certificado para o nome divulgado
Faça a lista de SANs do certificado corresponder à URL que o servidor Git divulga para clones (external_url no GitLab, ROOT_URL no Gitea), para que os usuários copiem URLs que passem na verificação.
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
Erros 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