Как я могу заставить git принимать самоподписанный сертификат?

648

Используя Git, есть ли способ заставить его принять самозаверяющий сертификат?

Я использую сервер https для размещения сервера git, но на данный момент сертификат самоподписан.

Когда я впервые пытаюсь создать там репо:

git push origin master -f

Я получаю ошибку:

error: Cannot access URL     
https://the server/git.aspx/PocketReferences/, return code 22

fatal: git-http-push failed
Ян Винк
источник
4
Откуда вы знаете, что выдача сертификата?
Янтарь
1
С ПК вместо этого инструмент Git другого пользователя позволяет им игнорировать сертификат, и он работает. С Mac я не могу понять, как игнорировать.
Ян Винк
Ошибка, которую я получил, с git 2.1.1: «fatal: невозможен доступ к https: //.../project.git/»: проблема с сертификатом SSL: самозаверяющий сертификат в цепочке сертификатов »
Stan Kurdziel
в OSX / Macintosh кажется, что git не будет использовать эту sslcainfoопцию. если вы можете успешно использовать curl --cacertпуть извлечения, но git не работает, вы должны добавить сертификат в таинственную программу OSX Keychain. больше здесь superuser.com/questions/605900/…
amwinter
Я считаю этот документ полезным gist.github.com/evantoli/f8c23a37eb3558ab8765
Mofaggol Hoshen

Ответы:

1170

Постоянно принимать определенный сертификат

Попробуйте http.sslCAPathили http.sslCAInfo. Ответ Адама Спирса дает несколько замечательных примеров. Это самое безопасное решение вопроса.

Чтобы отключить проверку TLS / SSL для одной команды git

попробуйте перейти -cк gitправильной переменной config или используйте ответ Flow :

git -c http.sslVerify=false clone https://example.com/path/to/git

Чтобы отключить проверку SSL для определенного репозитория

Если хранилище полностью находится под вашим контролем, вы можете попробовать:

git config --global http.sslVerify false

Есть довольно много вариантов конфигурации SSL в git. Со страницы руководства git config:

http.sslVerify
    Whether to verify the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_NO_VERIFY environment variable.

http.sslCAInfo
    File containing the certificates to verify the peer with when fetching or pushing
    over HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.

http.sslCAPath
    Path containing files with the CA certificates to verify the peer with when
    fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CAPATH environment variable.

Несколько других полезных опций конфигурации SSL:

http.sslCert
    File containing the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CERT environment variable.

http.sslKey
    File containing the SSL private key when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_KEY environment variable.

http.sslCertPasswordProtected
    Enable git's password prompt for the SSL certificate. Otherwise OpenSSL will
    prompt the user, possibly many times, if the certificate or private key is encrypted.
    Can be overridden by the GIT_SSL_CERT_PASSWORD_PROTECTED environment variable.
Кристофер
источник
40
'git config --global http.sslVerify false' добился цели. Спасибо!
Крис Стори
110
Вы никогда не должны глобально отключать проверку сертификата TLS (/ SSL) .
поток
4
@Flow - я полностью согласен. Я отредактировал этот (теперь довольно старый) ответ, чтобы полемизировать по поводу отключения проверки сертификата TLS / SSL.
Кристофер
8
для меня это git -c http.sslVerify=false clone https://domain.com/path/to/gitрешило мою проблему, спасибо ...
Фернандо Гомес
2
@Flow Если мы находимся в рабочей среде, где нашим работодателем является MITM , какая альтернатива глобальному отключению TLS / SSL?
Stevoisiak
165

Вы можете установить GIT_SSL_NO_VERIFYна true:

GIT_SSL_NO_VERIFY=true git clone https://example.com/path/to/git

или альтернативно настройте Git, чтобы он не проверял соединение в командной строке:

git -c http.sslVerify=false clone https://example.com/path/to/git

Обратите внимание, что если вы не проверяете сертификаты SSL / TLS, то вы подвержены атакам MitM .

поток
источник
2
Вы также можете использовать -cфлаг gitдля изменения значения конфигурации для одной команды. Я думаю, что этот синтаксис чище, хотя.
Кристофер
1
Ааа, я не знал об этом -cв Git. Я на самом деле думаю, что это более чистое решение, чем загрязнение окружающей среды. :)
Поток
1
@SkylarSaveland Обратите внимание, что git -c http.sslVerify=false <gitSubCommand>также может работать через посредников.
Поток
1
Должен отметить, что это решение открывает вам возможности для атак «люди посередине».
omikron
2
Ответ описывает только наименее безопасный вариант .
cp.engr
139

Я не большой поклонник [РЕДАКТИРОВАТЬ: оригинальные версии] существующих ответов, потому что отключение проверок безопасности должно быть последним средством, а не первым предлагаемым решением. Даже если вы не можете доверять самозаверяющим сертификатам при первом получении без какого-либо дополнительного метода проверки, использование сертификата для последующих gitопераций, по крайней мере, значительно усложняет жизнь атакам, которые происходят только после загрузки сертификата. Другими словами, если сертификат, который вы скачали, является подлинным, то с этого момента вы хороши. Напротив, если вы просто отключите проверку, то вы будете широко открыты для любой атаки «человек посередине» в любой точке .

Для конкретного примера: известный repo.or.czрепозиторий предоставляет самозаверяющий сертификат . Я могу скачать этот файл, поместить его где-то вроде /etc/ssl/certs, а затем сделать:

# Initial clone
GIT_SSL_CAINFO=/etc/ssl/certs/rorcz_root_cert.pem \
    git clone https://repo.or.cz/org-mode.git

# Ensure all future interactions with origin remote also work
cd org-mode
git config http.sslCAInfo /etc/ssl/certs/rorcz_root_cert.pem

Обратите внимание, что использование локального git configздесь (то есть без --global) означает, что этот самозаверяющий сертификат является доверенным только для этого конкретного репозитория, что хорошо. Это также приятнее, чем использование, GIT_SSL_CAPATHпоскольку устраняет риск gitвыполнения проверки через другой центр сертификации, который потенциально может быть скомпрометирован.

Адам Спирс
источник
3
По совпадению, http.sslCAPath использует логику libcurl ssl_capath. Я думаю, что вы могли бы хранить любое количество сертификатов в /etc/ssl/certs/каталоге, и это эффективно рассортировало бы все, что вам нужно. --globalЗаметьте, я не проверял это, но это может позволить вам использовать целую кучу сертификатов. Стоит проверить, однако.
Кристофер
6
Учитывая риску отключения проверки SSL в целом, а также тот факт , вопрос был «как я могу сделать мерзавец принять к самостоятельному сертификату?», Это должно быть приемлемым ответом.
PLNech
5
В идеальном мире было бы что-то вродеgit config http.validCertFingerprint <base64-encoded-hash-of-certifcate>
Flow
1
Единственный ответ в Интернете, который действительно работает для моего сценария. Это частная библиотека Composer VCS, размещенная на Gitlab с автономным размещением по протоколу SSL, которая мне требуется в проекте с версией git.
Дейв
1
Из свежего клона; это может быть сделано в одной строке: git clone --config http.sslCAInfo=<path_to_cert> https://repo.or.cz/org-mode.git(не нужно вызывать команду 'git config' после).
Аарон
39

Git Конфигурация подписанного сертификата

ТЛ; др

НИКОГДА не отключайте все проверки SSL!

Это создает плохую культуру безопасности. Не будь таким человеком.

Ключи конфигурации, которые вы ищете:

  • http.sslverify- Всегда правда. Смотри примечание выше.

Это для настройки сертификатов хоста, которым вы доверяете

Они предназначены для настройки ВАШЕГО сертификата для ответа на вызовы SSL.

Выборочно применить вышеуказанные настройки к конкретным хостам.

Global .gitconfigдля самоподписанных центров сертификации

Ради меня и моих коллег здесь показано, как нам удалось заставить самозаверяющие сертификаты работать без отключения sslVerify. Отредактируйте,.gitconfig чтобы использовать git config --global -eдобавить эти:

# Specify the scheme and host as a 'context' that only these settings apply
# Must use Git v1.8.5+ for these contexts to work
[credential "https://your.domain.com"]
  username = user.name

  # Uncomment the credential helper that applies to your platform
  # Windows
  # helper = manager

  # OSX
  # helper = osxkeychain

  # Linux (in-memory credential helper)
  # helper = cache

  # Linux (permanent storage credential helper)
  # https://askubuntu.com/a/776335/491772

# Specify the scheme and host as a 'context' that only these settings apply 
# Must use Git v1.8.5+ for these contexts to work
[http "https://your.domain.com"]
  ##################################
  # Self Signed Server Certificate #
  ##################################

  # MUST be PEM format
  # Some situations require both the CAPath AND CAInfo 
  sslCAInfo = /path/to/selfCA/self-signed-certificate.crt
  sslCAPath = /path/to/selfCA/
  sslVerify = true

  ###########################################
  # Private Key and Certificate information #
  ###########################################

  # Must be PEM format and include BEGIN CERTIFICATE / END CERTIFICATE, 
  # not just the BEGIN PRIVATE KEY / END PRIVATE KEY for Git to recognise it.
  sslCert = /path/to/privatekey/myprivatecert.pem

  # Even if your PEM file is password protected, set this to false.
  # Setting this to true always asks for a password even if you don't have one.
  # When you do have a password, even with this set to false it will prompt anyhow. 
  sslCertPasswordProtected = 0

Ссылки:

Укажите config когда git clone-ing

Если вам нужно применить его для каждого репо, в документации сказано, что вы должны просто запустить его git config --localв своем репо-каталоге. Ну, это бесполезно, если вы еще не клонировали репо локально, не так ли?

Вы можете сделать global -> localhokey-pokey, установив вашу глобальную конфигурацию, как указано выше, а затем скопировать эти настройки в вашу локальную конфигурацию репо, как только она клонируется ...

ИЛИ что вы можете сделать, это указать команды config,git clone которые будут применены к целевому репо после его клонирования.

# Declare variables to make clone command less verbose     
OUR_CA_PATH=/path/to/selfCA/
OUR_CA_FILE=$OUR_CA_PATH/self-signed-certificate.crt
MY_PEM_FILE=/path/to/privatekey/myprivatecert.pem
SELF_SIGN_CONFIG="-c http.sslCAPath=$OUR_CA_PATH -c http.sslCAInfo=$OUR_CA_FILE -c http.sslVerify=1 -c http.sslCert=$MY_PEM_FILE -c http.sslCertPasswordProtected=0"

# With this environment variable defined it makes subsequent clones easier if you need to pull down multiple repos.
git clone $SELF_SIGN_CONFIG https://mygit.server.com/projects/myproject.git myproject/

Один лайнер

РЕДАКТИРОВАТЬ: см. Ответ VonC , который указывает на предостережение об абсолютных и относительных путях для конкретных версий git от 2.14.x / 2.15 до этого одного лайнера

git clone -c http.sslCAPath="/path/to/selfCA" -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" -c http.sslVerify=1 -c http.sslCert="/path/to/privatekey/myprivatecert.pem" -c http.sslCertPasswordProtected=0 https://mygit.server.com/projects/myproject.git myproject/

CentOS unable to load client key

Если вы пытаетесь это сделать на CentOS, и ваш .pemфайл дает вам

unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"

Тогда вам понадобится ответ StackOverflow о том, как curlиспользовать NSS вместо Open SSL.

И вы хотите, чтобы восстановить curlиз источника :

git clone http://github.com/curl/curl.git curl/
cd curl/
# Need these for ./buildconf
yum install autoconf automake libtool m4 nroff perl -y
#Need these for ./configure
yum install openssl-devel openldap-devel libssh2-devel -y

./buildconf
su # Switch to super user to install into /usr/bin/curl
./configure --with-openssl --with-ldap --with-libssh2 --prefix=/usr/
make
make install

перезагрузите компьютер, так как libcurl все еще находится в памяти как общая библиотека

Питон, Пип и Конда

Связанный : Как добавить пользовательский корневой сертификат CA в CA Store, используемый pip в Windows?

Джош Пик
источник
Я должен был убедиться, что самоподписанный сертификат сервера был в формате PEM, прежде чем Git примет его. Кроме того, некоторые из приведенных выше ответов указывают, что нужно только указать путь к папке сертификата, используя http.sslCAPath. В моем случае мне пришлось использовать, http.sslCAInfoчтобы указать конкретный файл. Это позволило Git подключиться к нашему частному GitHub без отключения проверки SSL.
Зарепет
@Zarepheth Спасибо за эту информацию. Я столкнулся с той же проблемой, требующей как CAPath, так и CAInfo. Поскольку наш CA Cert был в формате PEM, я упустил возможность документировать его. Я обновил ответ с этими дополнениями. Рад, что вы смогли безопасно подключиться.
Джош Пик
Вероятно, это лучший долгосрочный ответ «исправить», если вы вынуждены использовать HTTPS для клонирования и не можете просто использовать SSH для обхода путаницы с сертификатами.
dragon788
Я собирался добавить этот ответ! Рад, что кто-то другой уже открыл это.
Франклин Ю.
14

Я постоянно сталкиваюсь с этой проблемой, поэтому написал сценарий для загрузки самозаверяющего сертификата с сервера и установки его в ~ / .gitcerts, а затем обновил git-config, чтобы он указывал на эти сертификаты. Он хранится в глобальном конфиге, поэтому его нужно запускать только один раз для каждого пульта.

https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh

Craig
источник
Хорошо, хотя было бы еще лучше иметь возможность использовать локальный конфиг вместо глобального.
Адам Спайерс
3
Вы всегда можете раскошелиться и удалить опцию --global ;-)
Крейг
Это довольно здорово, это входит в пакет?
Холтер
10

Этот ответ взят из этой статьи, автором которой является Майкл Кауфман.

Используйте Git для Windows с корпоративным сертификатом SSL

Выпуск :

Если у вас есть корпоративный сертификат SSL и вы хотите клонировать репозиторий из консоли или VSCode, вы получите следующую ошибку:

fatal: невозможно получить доступ к https: // myserver / tfs / DefaultCollection / _git / Proj / ': проблема с сертификатом SSL: невозможно получить сертификат локального эмитента

Решение :

  1. Экспортируйте корневой самозаверяющий сертификат в файл. Вы можете сделать это из вашего браузера.

  2. Найдите файл «ca-bundle.crt» в вашей папке git (текущая версия C: \ Program Files \ Git \ usr \ ssl \ certs, но она изменилась в прошлом). Скопируйте файл в свой профиль пользователя. Откройте его в текстовом редакторе, таком как VSCode, и добавьте содержимое экспортированного сертификата в конец файла.

Теперь нам нужно настроить git для использования нового файла:

git config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt

Это добавит следующую запись в ваш файл .gitconfig в корне вашего профиля пользователя.

[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt

AperioOculus
источник
1
Спасибо, я нашел этот ответ проще и безопаснее для Windows.
Пису
7

Отключение проверки SSL для определенного хранилища. Если хранилище полностью находится под вашим контролем, вы можете попробовать:

 git config --global http.sslVerify false
Саурабх Верма
источник
3

Будьте осторожны , когда вы используете один вкладыш с использованием sslKey или sslCert, как Джош Пик «S ответ :

git clone -c http.sslCAPath="/path/to/selfCA" \
  -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" \
  -c http.sslVerify=1 \
  -c http.sslCert="/path/to/privatekey/myprivatecert.pem" \
  -c http.sslCertPasswordProtected=0 \
https://mygit.server.com/projects/myproject.git myproject

Только Git 2.14.x / 2.15 (3 квартал 2015 г.) сможет интерпретировать путь как ~username/mykeyправильно (хотя он все еще может интерпретировать абсолютный путь как /path/to/privatekey).

См. Коммит 8d15496 (20 июля 2017 г.) от Junio ​​C Hamano ( gitster) .
Помогает: Чарльз Бейли ( hashpling) .
(Слиты Junio C Hamano - gitster- в фиксации 17b1e1d , 11 августа 2017)

http.c: http.sslcertи http.sslkeyоба пути

Назад, когда был создан современный код пути http_options () для анализа различных параметров http. * По адресу 29508e1 («Изолировать функцию общего HTTP-запроса», 2005-11-18, Git 0.99.9k), а затем был исправлен для взаимодействия между несколькими Конфигурационные файлы в 7059cd9 (" http_init(): Исправить синтаксический анализ конфигурационного файла", 2009-03-09, Git 1.6.3-rc0), мы проанализировали конфигурационные переменные http.sslkey, http.sslcertкак простые ванильные строки, потому git_config_pathname()что это понимает, что ~[username]/префикс " " не существует.

Позже мы преобразовали некоторые из них (а именно, http.sslCAPathи http.sslCAInfo) для использования функции, и добавили переменные, такие как http.cookeyFile http.pinnedpubkeyиспользование функции с самого начала. Из-за этого все эти переменные понимают ~[username]/префикс " ".

Сделайте оставшиеся две переменные, http.sslcertа http.sslkeyтакже помните о соглашении, так как они оба являются явно путями к файлам.

VonC
источник
3

Используя 64-битную версию Git для Windows, просто добавьте самоподписанный сертификат CA в эти файлы:

  • C: \ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.crt
  • C: \ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.trust.crt

Если это просто самозаверяющий сертификат сервера, добавьте его в

  • C: \ Program Files \ Git \ mingw64 \ ssl \ cert.pem
Flaviu
источник
Это был лучший способ справиться с брандмауэром нашей компании, который переподписывает весь HTTPS-трафик. Я просто взял отформатированный в PEM файл crt сертификата брандмауэра в виде текста и скопировал его в ca-bundle, и он работает как шарм.
Mitten.O
3

Проверьте настройки антивируса и брандмауэра.

От одного дня до другого, git больше не работал. С помощью описанного выше я обнаружил, что Kaspersky помещает самоподписанный антивирусный личный корневой сертификат в середину. Мне не удалось позволить Git принять этот сертификат, следуя инструкциям выше. Я отказался от этого. Что работает для меня, так это отключить функцию сканирования зашифрованных соединений.

  1. Открой Касперского
  2. Настройки> Дополнительно> Сеть> Не проверять зашифрованные соединения

После этого git снова работает с включенным sslVerify.

Запись. Это все еще не удовлетворяет меня, потому что я хотел бы, чтобы эта функция моего Антивируса была активной. В расширенных настройках Kaspersky показывает список сайтов, которые не будут работать с этой функцией. Github не указан как один из них. Я проверю это на форуме Касперского. Кажется, есть некоторые темы, например, https://forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211

Henk
источник
1

В файле .gitconfig вы можете добавить указанное ниже значение, чтобы сделать самоподписанный сертификат приемлемым.

sslCAInfo = /home/XXXX/abc.crt

РахулМохан Колаканды
источник
Это эквивалентно второму шагу в ответе Адама
Майкл - Где
1

Я делаю это так:

git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git
Tadej
источник
3
Не используйте --global! Много уроков показывают, --globalно это очень плохая идея в целом и http.sslVerifyв частности. Как только у вас есть более одного клона из разных проектов, компаний, команд на компьютере, вы можете быстро столкнуться с неприятностями. Например, идентификатор пользователя и электронные письма, просачивающиеся из одного проекта в другой, могут быть довольно смущающими. А использование --globalon http.sslVerifyможет открыть для вас все виды проблем безопасности. Итак: не используйте --global- если вы не полностью осведомлены о побочных эффектах и ​​не готовы пойти на риск.
Мартин
1

На Windows это работало для меня:

Добавьте содержимое вашего собственного подписанного сертификата в конец файла ca-bundle . Включая ----- НАЧАТЬ СЕРТИФИКАТ ----- и ----- КОНЕЦ СЕРТИФИКАТА ----- строки

Расположение файла ca-bundle обычно C: \ Program Files \ Git \ mingw64 \ ssl \ certs

Затем добавьте путь к файлу ca-bundle в глобальный git config. Следующая команда делает трюк:git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

Примечание: Путь зависит от вашего локального пути к файлу ca-bundle!

rw026
источник
1

Я использую машину Windows, и эта статья помогла мне. В основном я открыл ca-bundle.crt в блокноте и добавил цепные сертификаты в него (все они). Эта проблема обычно возникает в сетях компаний, где у нас посредники сидят между системой и git-репо. Нам нужно экспортировать все сертификаты в цепочке сертификатов, кроме листового сертификата в формате base 64, добавить их все в ca-bundle.crt и затем настроить git для этого модифицированного файла crt.

любовь гупта
источник
1

Не рекомендуется устанавливать http.sslVerify false. Вместо этого мы можем использовать сертификат SSL.

Таким образом, агент сборки будет использовать https с SSL-сертификатом и PAT для аутентификации. введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Скопируйте содержимое файла cer, включая –begin — и –end--.

git bash on build agent => git config –global http.sslcainfo «C: / Program Files / Git / mingw64 / ssl / certs / ca-bundle.crt» Перейдите к этому файлу и добавьте содержимое .cer.

Таким образом, агент сборки может получить доступ к SSL-сертификату.

Палаш Рой
источник
0

Мой ответ может быть поздно, но это сработало для меня. Это может кому-то помочь.

Я попробовал вышеупомянутые шаги, и это не решило проблему.

попробуй этоgit config --global http.sslVerify false

Manjuboyz
источник