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

Используя 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

Ответ 1

Чтобы окончательно принять конкретный сертификат

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

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

попробуйте передать -c в git с соответствующей конфигурационной переменной или используйте Ответ потока:

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

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

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

git config http.sslVerify false

Отключение проверки сертификата TLS (/SSL) во всем мире является ужасно небезопасной практикой. Не делай этого. Не выдавайте вышеуказанную команду с помощью модификатора --global.


В git имеется несколько параметров конфигурации SSL. На странице man 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 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.

Ответ 2

Вы можете установить 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.

Ответ 3

Я не являюсь большим поклонником существующих [EDIT: исходных версий] существующих ответов, потому что отключение проверок безопасности должно быть последним средством, а не первым предлагаемым решением. Даже если вы не можете доверять самоподписанным сертификатам при первом получении без какого-либо дополнительного метода проверки, использование сертификата для последующих операций 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 выполнения проверки через другой центр сертификации, который потенциально может быть скомпрометирован.

Ответ 4

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

ТЛ; др

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

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

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

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

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

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

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

Глобальный .gitconfig для .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 → local hokey-pokey, установив вашу глобальную конфигурацию, как указано выше, а затем скопировать эти настройки в вашу локальную конфигурацию репо, как только она клонируется...

ИЛИ что вы можете сделать, это указать команды конфигурации в 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)"

Тогда вам понадобится fooobar.com/questions/17221/... о том, как 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?

Ответ 5

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

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

Ответ 6

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

Используйте 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

Ответ 7

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

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

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

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

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

Ответ 8

Будьте осторожны, когда вы используете один лайнер с помощью sslKey или sslCert, как в Josh Peak answer:

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 (Q3 2015) сможет правильно интерпретировать путь как ~username/mykey (хотя он все еще может интерпретировать абсолютный путь, например /path/to/privatekey).

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

http.c: http.sslcert и http.sslkey являются именами путей

Назад, когда была создана современная http_options() codepath для синтаксического анализа различные параметры http. * в 29508e1 ( "Изолировать общий HTTP-запрос функциональность", 2005-11-18, Git 0.99.9k), а затем была исправлена взаимодействие между несколькими конфигурационными файлами в 7059cd9( "http_init(): Fix config file parsing", 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, также осознавая конвенцию, поскольку они оба явно являются путями к файлы.

Ответ 9

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

sslCAInfo =/home/XXXX/abc.crt

Ответ 10

Используя 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

Ответ 11

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

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

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

Ответ 12

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

git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git

Ответ 13

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

Добавьте содержимое вашего самоподписанного сертификата в конец файла ca-bundle. Включая линии -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----

Расположение файла 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": git config --global http.sslCAInfo "C: /Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

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

Ответ 14

Выполните следующую команду:

git config --global http.sslVerify false