it-swarm.com.ru

Как я могу заставить 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
528
BahaiResearch.com

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

Попробуйте 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 http.sslVerify false

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


В git довольно много вариантов конфигурации SSL. Со страницы руководства 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.
941
Christopher

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

149
Flow

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

Чтобы привести конкретный пример: знаменитый 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) означает, что этот самозаверяющий сертификат является доверенным только для этого конкретного репозитория, который является Nice. Это также приятнее, чем использование GIT_SSL_CAPATH, поскольку устраняет риск того, что git выполнит проверку через другой центр сертификации, который потенциально может быть скомпрометирован.

120
Adam Spiers

Глобальный .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-

Если вам нужно применить его для каждого репо, в документации сказано, что вам нужно просто запустить 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 's answer , который указывает на предостережение об абсолютных и относительных путях для определенных версий 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 все еще находится в памяти как общая библиотека

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

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

23
Josh Peak

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

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

14
Craig

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

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

Issue

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

фатально: невозможно получить доступ к ‘ 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

6
AperioOculus

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

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

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

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

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

3
Henk

Будьте осторожны, когда вы используете один вкладыш, используя sslKey или sslCert, как в Josh Peak 's 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 (3 квартал 2015 года) сможет правильно интерпретировать путь, например ~username/mykey (хотя он все еще может интерпретировать абсолютный путь, например /path/to/privatekey).

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

http.c: http.sslcert и http.sslkey оба являются путями

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

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

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

2
VonC

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

sslCAInfo = /home/XXXX/abc.crt

1
RahulMohan Kolakandy

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

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

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

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

0
Manjuboyz

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

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