Сообщение об ошибке
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'
Также выводится как
- SSL: certificate subject name (www.example.com) does not match target host name 'git.example.com'
Имена в скобках и кавычках берутся из вашего сертификата и URL вашего удалённого репозитория. libcurl 7.x выводила «target host name», libcurl 8.x выводит «target hostname». Сборки git с OpenSSL (Git for Windows, Alpine) выводят «SSL: no alternative certificate subject name matches target hostname '…'».
Что это означает
Сертификату Git-сервера доверяют, но он выпущен на имя, отличное от хоста в URL удалённого репозитория. libcurl-gnutls приводит имя субъекта сертификата в скобках, а хост, к которому подключался git, — в конце. Учётные данные не отправлялись: соединение прерывается до первого HTTP-запроса.
Почему это происходит
В сертификате нет имени Git-хоста
частоGit-сервер переехал на новое имя (git.example.com вместо gitlab.example.com) или получил второе имя, а сертификат не перевыпустили.
В URL удалённого репозитория указан псевдоним или IP-адрес
частоКлоны, созданные по внутреннему псевдониму, IP-адресу или старому имени хоста, хранят этот URL в файле конфигурации .git/config ещё долго после того, как сертификат выпустили на каноническое имя.
Прокси перед Git-сервером отправляет свой сертификат по умолчанию
иногдаОбратный прокси или ingress без правила для запрошенного имени предъявляет сертификат другого виртуального хоста.
Как исправить
- 1.
Сравните URL удалённого репозитория с сертификатом
Выведите URL удалённого репозитория, а также субъект и список SAN сертификата: расхождение обычно сразу видно.
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.
Укажите для удалённого репозитория имя, на которое выпущен сертификат
git remote set-url меняет URL, сохранённый в конфигурации репозитория, без повторного клонирования.
bash # Use the name the certificate was issued for git remote set-url origin https://gitlab.example.com/team/app.git - 3.
Владельцам серверов: выпустите сертификат на имя, которое показывает сервер
Приведите список SAN сертификата в соответствие с URL, который Git-сервер показывает для клонирования (external_url в GitLab, ROOT_URL в Gitea), чтобы пользователи копировали URL, проходящие проверку.
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
Связанные ошибки
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