налаштувати Git для прийому певного сертифіката сервера, який підписує сам, для певного віддаленого https


167

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

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


Ви питаєте про C Git на Unix, я припускаю?
Piotr Findeisen

Так. Ну, можливо, і Windows, але зараз це ніхто не робить.
zwol

5
WTF? @Zack ви абсолютно праві щодо перевірки сертифікатів. Коли ваш адміністратор каже, що вам слід вимкнути перевірку сертифікатів, він також може вимкнути TLS на сервері, оскільки тоді кожен вимикає захист від атаки "посередник".
Руді

@Rudi, це все-таки так, якщо вони використовують IP-адресу для доступу до сервера? (Здається, пошук DNS - це те, як MITM стає між ними, тому я думаю, що IP-адреса повинна бути незахищеною від цього.)
Кріс,

6
@Chris Так, це все одно. Маршрутизатор MITM може претендувати на будь-яку IP-адресу, яку вони хочуть. (Ви знаєте ті проміжні сторінки, які ви отримуєте на безкоштовному wifi в аеропорту? Це 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 до https).


1
я вважаю, що ця відповідь більш правильна і повна, ніж прийнята. дякую @Jan Vlcinsky
Альфредо Кавальканті

1
Після цього звичайні сертифікати, підписані владою, перестають працювати, тому я не можу витягнути, наприклад, з Github. Чи можна додати самопідписаний сертифікат без вимкнення підписаних повноважень?
Михайло Івко

4
@MichaelIvko рішення, яке враховує описані тут "звичайні сертифікати, підписані владою" (потрібно додати свій сертифікат у файл "curl-ca-bundle.crt"): blogs.msdn.com/b/phkelley/archive/2014/ 01/20 /…
Станіслав Берков

3
Проблема такого підходу полягає в тому, що він ефективно видаляє всі ЦТ за замовчуванням, які постачаються з git (наприклад, після цього ви не зможете витягнути з github). Швидше за все, це не те, що більшість шукають. Кращим прикладом є додавання нового кореневого ЦС до копії Git \ bin \ curl-ca-bundle.crt, а потім посилання на нову копію curl-ca-bundle.crt зі свого gitconfig.
crimbo

3
це працює на windows! експортувати кожен сертифікат у ланцюжку сертифікатів, як закодований файл Base64 X.509 (.CER) Зберіть всі файли разом і посилайтеся на цей файл. Будьте впевнені, що у вас немає пробілів у шляху до файлу cert (використовуйте oldschool paths)
pscheit

3

Коригування користувача OSX.

Виконуючи дії прийнятого відповіді, мені працювали з невеликим доповненням під час налаштування на OSX.

Я помістив cert.pemфайл у каталог під моїм OSX, який увійшов у систему, і, таким чином, змусив мене змінити місце для довіреного сертифіката.

Налаштуйте git, щоб довірити цьому сертифікату:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.