настроить Git для принятия определенного самозаверяющего сертификата сервера для определенного удаленного HTTPS

167

Системный администратор проекта, над которым я работаю, решил, что SSH "слишком много проблем"; вместо этого он настроил Git так, чтобы он был доступен через https://URL (и аутентификацию по имени / паролю). Сервер для этого URL представляет самозаверяющий сертификат, поэтому он посоветовал всем отключить проверку сертификата. Это не кажется мне хорошей установкой с точки зрения безопасности.

Можно ли сказать Git, что для удаленного X (или лучше для любого удаленного в любом репозитории, который начинается с https://$SERVERNAME/) он должен принимать определенный сертификат и только этот сертификат? В основном дублирование поведения ключа сервера SSH.

zwol
источник
Вы спрашиваете о C Git на Unix, я полагаю?
Петр Финдейзен
Ях. Ну, возможно, также Windows, но никто не делает это прямо сейчас.
zwol
5
WTF? @ Зак ты абсолютно прав насчет проверок сертификатов. Когда ваш администратор говорит, что вы должны отключить проверку сертификатов, он также может отключить TLS на сервере, поскольку каждый из них отключает защиту от атаки «человек посередине».
Руди
@Rudi, это все еще так, если они используют IP-адрес для доступа к серверу? (Похоже, что поиск DNS - это то, как MITM становится промежуточным звеном, поэтому я думаю, что IP-адрес должен быть защищен от этого.)
Крис
6
@ Крис Да, это все еще так. Маршрутизатор MITM может претендовать на любой IP-адрес, который они хотят. (Вам известны эти промежуточные страницы, которые вы получаете на бесплатном Wi-Fi в аэропорту? Это MITM. Попробуйте как-нибудь зайти на страницу по IP-адресу.)
zwol

Ответы:

295

Кратко:

  1. Получите самоподписанный сертификат
  2. Поместите это в некоторый (например ~/git-certs/cert.pem) файл
  3. Установите, gitчтобы доверять этому сертификату, используя http.sslCAInfoпараметр

Более подробно:

Получить самозаверяющий сертификат удаленного сервера

Предполагается, что URL-адрес сервера repos.sample.comи вы хотите получить доступ к нему через порт 443.

Есть несколько вариантов, как его получить.

Получить сертификат с помощью openssl

$ openssl s_client -connect repos.sample.com:443

Поймать вывод в файл cert.pemи удалить все, кроме части между (и в том числе) -BEGIN CERTIFICATE-и-END CERTIFICATE-

Содержимое получившегося файла ~ / git-certs / cert.pem может выглядеть так:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
EwYDVQQIEwxMb3dlciBTYXhvbnkxEjAQBgNVBAcTCVdvbGZzYnVyZzEYMBYGA1UE
ChMPU2FhUy1TZWN1cmUuY29tMRowGAYDVQQDFBEqLnNhYXMtc2VjdXJlLmNvbTEj
MCEGCSqGSIb3DQEJARYUaW5mb0BzYWFzLXNlY3VyZS5jb20wHhcNMTIwNzAyMTMw
OTA0WhcNMTMwNzAyMTMwOTA0WjCBkzELMAkGA1UEBhMCREUxFTATBgNVBAgTDExv
d2VyIFNheG9ueTESMBAGA1UEBxMJV29sZnNidXJnMRgwFgYDVQQKEw9TYWFTLVNl
Y3VyZS5jb20xGjAYBgNVBAMUESouc2Fhcy1zZWN1cmUuY29tMSMwIQYJKoZIhvcN
AQkBFhRpbmZvQHNhYXMtc2VjdXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMUZ472W3EVFYGSHTgFV0LR2YVE1U//sZimhCKGFBhH3ZfGwqtu7
mzOhlCQef9nqGxgH+U5DG43B6MxDzhoP7R8e1GLbNH3xVqMHqEdcek8jtiJvfj2a
pRSkFTCVJ9i0GYFOQfQYV6RJ4vAunQioiw07OmsxL6C5l3K/r+qJTlStpPK5dv4z
Sy+jmAcQMaIcWv8wgBAxdzo8UVwIL63gLlBz7WfSB2Ti5XBbse/83wyNa5bPJPf1
U+7uLSofz+dehHtgtKfHD8XpPoQBt0Y9ExbLN1ysdR9XfsNfBI5K6Uokq/tVDxNi
SHM4/7uKNo/4b7OP24hvCeXW8oRyRzpyDxMCAwEAATANBgkqhkiG9w0BAQUFAAOC
AQEAp7S/E1ZGCey5Oyn3qwP4q+geQqOhRtaPqdH6ABnqUYHcGYB77GcStQxnqnOZ
MJwIaIZqlz+59taB6U2lG30u3cZ1FITuz+fWXdfELKPWPjDoHkwumkz3zcCVrrtI
ktRzk7AeazHcLEwkUjB5Rm75N9+dOo6Ay89JCcPKb+tNqOszY10y6U3kX3uiSzrJ
ejSq/tRyvMFT1FlJ8tKoZBWbkThevMhx7jk5qsoCpLPmPoYCEoLEtpMYiQnDZgUc
TNoL1GjoDrjgmSen4QN5QZEGTOe/dsv1sGxWC+Tv/VwUl2GqVtKPZdKtGFqI8TLn
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Получить сертификат с помощью веб-браузера

Я использую Redmine с репозиториями Git и получаю доступ к одному и тому же URL для веб-интерфейса и доступа к командной строке git. Таким образом, мне пришлось добавить исключение для этого домена в мой веб-браузер.

Используя Firefox, я пошел туда Options -> Advanced -> Certificates -> View Certificates -> Servers, нашел там самоподписанный хост, выбрал его и с помощью Exportкнопки получил точно такой же файл, который был создан с помощью openssl.

Примечание: я был немного удивлен, явно не упоминается название органа. Это отлично.

Наличие доверенного сертификата в выделенном файле

Предыдущие шаги должны привести к наличию сертификата в каком-либо файле. Не имеет значения, какой это файл, если он виден вашему git при доступе к этому домену. я использовал~/git-certs/cert.pem

Примечание. Если вам нужно больше доверенных самоподписанных сертификатов, поместите их в тот же файл:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Это должно работать (но я проверил это только с одним сертификатом).

Настройте git для доверия этому сертификату

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

Вы также можете попытаться сделать это в масштабе всей системы, используя --systemвместо --global.

И проверьте это: теперь вы сможете общаться с вашим сервером, не прибегая к:

$ git config --global http.sslVerify false #NO NEED TO USE THIS

Если вы уже настроили свой git на игнорирование ssl-сертификатов, удалите его:

$ git config --global --unset http.sslVerify

и вы также можете проверить, что вы все сделали правильно, без орфографических ошибок:

$ git config --global --list

Что следует перечислить все переменные, вы установили глобально. (Я неправильно ввел http в htt).

Ян Влчинский
источник
1
Я думаю, что этот ответ является более правильным и полным, чем принятый. спасибо @Jan Vlcinsky
Альфредо Кавальканти
1
После этого перестают работать обычные подписанные властью сертификаты, поэтому я не могу вытащить, например, из Github. Есть ли способ добавить самозаверяющий сертификат, не отключая авторитет подписанных сертификатов?
Михаил Ивко
4
Решение @MichaelIvko, которое учитывает «обычные сертификаты, подписанные властями», описанные здесь (вам необходимо добавить свой сертификат в файл «curl-ca-bundle.crt»): blogs.msdn.com/b/phkelley/archive/2014/ 01/20 /…
Станислав Берков
3
Проблема этого подхода заключается в том, что он эффективно удаляет все CA по умолчанию, которые поставляются с git (например, после этого вы не сможете использовать github). Скорее всего, это не то, что большинство ищет. Лучший пример - добавить новый корневой CA в копию Git \ bin \ curl-ca-bundle.crt, а затем сослаться на новую копию curl-ca-bundle.crt из вашего gitconfig.
Crimbo
3
это работает на окнах! экспортируйте каждый сертификат в цепочке сертификатов как файл X.509 с кодировкой Base64 (.CER). Сложите все файлы вместе и создайте ссылку на этот файл. Убедитесь, что у вас нет пробелов в пути к файлу сертификата (используйте пути
oldschool
3

Настройки пользователя OSX.

Следующие шаги Принято ответ работал для меня с небольшим дополнением при настройке на OSX.

Я поместил cert.pemфайл в каталог под моим пользователем OSX, вошедшим в систему, и таким образом заставил меня настроить местоположение для доверенного сертификата.

Настройте git для доверия этому сертификату:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Крис Лэнгстон
источник