не вдалося підтвердити сертифікат сервера. CAfile: /etc/ssl/certs/ca-certificate.crt CRLfile: немає


334

Я можу подати проект клонування за допомогою ssh, але він не працює, коли я клоную проект за допомогою https.

Повідомлення про помилку, яке мені показує:

server certificate verification failed. CAfile: /etc/ssl/certs/cacertificates.crt CRLfile: none

Відповіді:


422

TLDR:

hostname=XXX
port=443
trust_cert_file_location=`curl-config --ca`

sudo bash -c "echo -n | openssl s_client -showcerts -connect $hostname:$port -servername $hostname \
    2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'  \
    >> $trust_cert_file_location"

Довга відповідь

Основна причина полягає в тому, що ваш комп'ютер не довіряє органу сертифікації, який підписав сертифікат, який використовується на сервері Gitlab . Це не означає, що сертифікат є підозрілим, але він може бути самостійно підписаний або підписаний установою / компанією, яка не входить до списку ваших ОС ОС. Що вам потрібно зробити, щоб обійти проблему на своєму комп’ютері, це сказати їй довіряти цьому сертифікату - якщо у вас немає причин підозріло ставитися до цього.

Вам потрібно перевірити веб-сертифікат, який використовується для вашого сервера gitLab, і додати його до свого </git_installation_folder>/bin/curl-ca-bundle.crt.

Щоб перевірити, чи працює принаймні клон без перевірки зазначеного сертифіката, ви можете встановити:

export GIT_SSL_NO_VERIFY=1
#or
git config --global http.sslverify false

Але це було б лише для тестування, як показано в " SSL працює з браузером, wget і curl, але не вдається з git ", або в цій публікації блогу .

Перевірте свої параметри GitLab, випуску 4272 .


Щоб отримати цей сертифікат (який потрібно було б додати у curl-ca-bundle.crtфайл), введіть:

echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpsGitlabPort \
  2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

(" yourserver.com'- це ваше ім'я сервера GitLab, і YourHttpsGitlabPortзазвичай це порт https 443)

Щоб перевірити CA (емітент органу сертифікації), введіть:

echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpsGilabPort \
  2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \
  | openssl x509 -noout -text | grep "CA Issuers" | head -1

Примітка: Валерій Катков пропонує у коментарях додати -servernameопцію до команди openssl, інакше команда не відображає сертифікат для www.github.com у випадку Валерія.

openssl s_client -showcerts -servername www.github.com -connect www.github.com:443

Фіндекано додає в коментарях :

для визначення місця розташування curl-ca-bundle.crtви можете скористатися командою

curl-config --ca

Також дивіться мою останню відповідь " Не вдалося підтвердити сертифікат сервера ": вам, можливо, доведеться перевстановити ці сертифікати:

sudo apt-get install --reinstall ca-certificates
sudo mkdir /usr/local/share/ca-certificates/cacert.org
sudo wget -P /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt
sudo update-ca-certificates
git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt

8
Чи не в оригінальному повідомленні вказується, куди слід додати сертифікат? У моєму випадку curl-config --caповернувся /etc/ssl/certs/ca-certificates.crt, саме там мені довелося додати сертифікат. Окрім цього, ця відповідь була першою інформацією, яка вказує на мене у правильному напрямку із цим питанням
uli_1973

1
Як знайти папку встановлення git?
Бхаргав

1
@Bhargav це залежить від вашої ОС. У Linux, ви можете зробити which git.
VonC

3
Я побіг curl-config --ca, але нічого не повернули.
Фернандо Коста

1
Дякую за пораду - ти врятував мені день.
Janne

220

Примітка. Це має великі наслідки для безпеки.

Відкрийте свій термінал і запустіть наступну команду:

export GIT_SSL_NO_VERIFY=1

Це працює для мене, і я використовую систему Linux.


60
Не зволікаючи, тому що це вирішення, коли ти знаєш, що робиш. Однак настійно рекомендую проти цього в загальному випадку.
трійка

9
Я б не сказав її вирішення, коли ти знаєш, що ти робиш. Коли ви знаєте, що ви робите, ви повинні подивитися на те, що сертифікат не працює, як "можливо, хтось зламав нас" не "о, добре, безпека каже, що хтось зламав нас, гадаю, нам потрібно відключити безпеку". Це в кращому випадку міра зупинки, якщо щось потрібно відсунути якнайшвидше.
srcspider

1
Експортом над прапором я потрапляю нижче помилки ererr.error: RPC не вдалося; результат = 22, код HTTP = 403 фатально: віддалений кінець несподівано завис помилка: RPC не вдалося; результат = 22, HTTP-код = 403 фатально: Віддалений кінець зненацька завис
Desu

7
На мене працювали лишеgit config --global http.sslverify false
Діней

2
Чудово. Ви заощадили мій час.
Sai prateek

146

Ще однією причиною цієї проблеми може бути те, що ваш годинник може бути вимкненим. Сертифікати залежать від часу.

Щоб перевірити поточний системний час:

date -R

Ви можете розглянути можливість встановлення NTP для автоматичної синхронізації системного часу з надійними інтернет-таймерами із глобального пулу NTP . Наприклад, для встановлення на Debian / Ubuntu:

apt-get install ntp

5
Це була моя проблема. Мій університет блокував пакети ntp, що заважало моїй системі оновити час. Одного разу я налаштував університетські сервери ntp, і знову працювали. Дякую за цю пораду!
Кайл

3
Це також було причиною моєї проблеми, я використовував вбудований пристрій, у якого неправильна дата!
Шервін Емамі

Це була моя проблема, з сертом. Я витратив години, переглядаючи всілякі рішення, перш ніж виявити, що проблема полягала в тому, що годинник сервера встановлюється в майбутнє. Однак це не допомогло мені отримати майбутній випуск Node.js. :-(
Кевін Тельєр

1
@Katu це не gitскажеш, це основний обмін SSL. Git побудований із підтримкою SSL.
Іван

1
Я б схвалив це 10000 разів .... шукав, чому він не працює протягом 6 цілих годин зараз ... Сервер був вимкнений менше ніж на 7 хвилин, і це зробило трюк ... ДЯКУЮ!
dGo

66

Якщо ви використовуєте сервер git всередині приватної мережі та використовуєте сертифікат із власним підписом або сертифікат через IP-адресу; Ви також можете просто скористатися глобальною конфігурацією git, щоб відключити перевірки ssl:

git config --global http.sslverify "false"

43

Була така ж проблема. Викликаний власноруч виданим сертифікатним органом. Вирішили це, додавши .pem файл в / usr / local / share / ca-сертифікати / та зателефонувавши

sudo update-ca-certificates

PS: pem-файл у папці ./share/ca-certificate ОБОВ'ЯЗКОВО мати розширення .crt


2
Працював як шарм у монетному дворі linux 16 :)
greuze

ти маєш на увазі cert.pem або cert.crt або cert.pem.crt?
Мойсей Ляо GZ

1
cert.pem має бути перейменовано на cert.pem.crt
Микола Рубан

34

Перевірте свій системний годинник,

$ date

Якщо це неправильно, перевірка сертифіката не вдасться. Щоб виправити системний годинник,

$ apt-get install ntp

Годинник повинен сам синхронізуватися.

Нарешті знову введіть команду клонування.


1
Так! У мене екземпляр Ubuntu був призупинений у VirtualBox надовго. Системний годинник не синхронізувався з будь-якої причини, коли я не зупинився. Відповідь VonC здається обізнаною, але я дуже радий, що мені не довелося виконувати купу команд безпеки, яких я не розумію. Перевірте це спочатку!
AndyJost

24
GIT_CURL_VERBOSE=1 git [clone|fetch]…

повинен сказати вам, де проблема. У моєму випадку це було пов’язано з тим, що CURL не підтримує PEM-сертифікати, коли він побудований проти NSS, через те, що підтримка не є основною лінією в NSS ( # 726116 # 804215 # 402712 і більше ).


4
Приємне доповнення з GIT_CURL_VERBOSE. Я не згадував це у своїй відповіді. +1
VonC

18

Або просто запустіть цей коментар, щоб додати Сертифікат сервера до вашої бази даних:

echo $(echo -n | openssl s_client -showcerts -connect yourserver.com:YourHttpGilabPort 2>/dev/null  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p') >> /etc/ssl/certs/ca-certificates.crt

Потім зробіть клонування Git знову.


1
Я не знаю, чи це працює для когось, але мені потрібно "трійник", щоб додати файл cert як root: echo -n | openssl s_client -showcerts-підключити yourserver.com:243 2> / dev / null | sed -ne '/ -БЕГІНОВИЙ СЕРТИФІКАТ - /, / - ЗАКОННИЙ СЕРТИФІКАТ / / p' | sudo tee -a /etc/ssl/certs/ca-certificate.crt
ywu

У моєму випадку сервер має дійсний сертифікат, але моя база даних не включає його, за допомогою цієї команди я вирішив, але мушу сказати, що ця команда повинна бути запущена з правами root.
hermeslm

10

Під час налаштування проксі-сервера я зіпсував свої файли CA. Неможливо витягнути дані з github і отримати те саме попередження:

не вдалося підтвердити сертифікат сервера. CAfile: /etc/ssl/certs/ca-certificate.crt CRLfile: немає

скористайтеся методом Vonc, отримайте сертифікат від github та вставте його у /etc/ssl/certs/ca-certificate.crt, проблему вирішено.

ехо -н | openssl s_client -showcerts -connect github.com:243 2> / dev / null | sed -ne '/ -БЕГІНОВИЙ СЕРТИФІКАТ - /, / - КОНТРОЛЬНИЙ СЕРТИФІКАТ / / p'


8

немає необхідності встановлювати перевірку git ssl на false. Він виникає, коли система не має всіх сертифікатів повноважень CA. Переважно серед людей, у яких справжній сертифікат SSL, відсутній проміжний сертифікат.

Просто додавання повного тексту проміжного сертифіката (цілий ланцюг відсутнього КА та проміжний сертифікат) до

sudo gedit /etc/ssl/certs/ca-certificates.crt 

працює без запуску update-ca-certificates.

Те саме стосується і генерованих вручну сертифікатів, просто додайте текст сертифіката CA.

На завершення: Push вдалий: Все актуально


1
Те ж саме може бути спричинено, якщо сервер не налаштований належним чином із усіма ланцюгами SSL CA.
abcdef12

Проблеми з ланцюжком можуть бути причиною, як коментує abcdef12. У мене була ця проблема з git 1.9.1 - сервер посилав ланцюг cert: # 0 cert сервера; # 1 сервер cert (знову); №2 підписант cert. Дублікат у ланцюжку був причиною того, що git не сподобався.
jah

8

Що я зробив, щоб вирішити цю проблему в терміналі (Ubuntu 18.04):

openssl s_client -showcerts -servername www.github.com -connect www.github.com:443

Я отримав два шматки сертифікату. І я скопіював фрагменти сертифікату в мій файл сертифіката в /etc/ssl/certs/ca-certificates.crt.


Це рішення вирішує мою ідентичну проблему в Ubuntu 16.04.
користувач3072843

Що саме ви маєте на увазі під шматками сертифікату ? Блок між ---BEGIN CERTIFICATE---і --- END CERTIFICATE ---?
В - Ріан

3

Я встановив Xubuntu на Raspberry pi 2, виявив таку ж проблему з часом, як синхронізація NTP та автоматичного сервера була вимкнена (або не встановлена). Отримайте NTP

sudo apt-get install ntp

і змініть "Час і дата" з "Посібника" на "Продовжуйте синхронізуватися з Інтернет-серверами"


1

Врешті-решт, додайте http.sslverify до свого .git / config.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = https://server/user/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[http]
        sslVerify = false

1
Краще використовувати командний рядок git config http.sslVerify false. Ви пропонуєте редагувати конфігурацію Git на основі репозиторію, а не в усьому світі, як це запропонував @ romain-vdk?
ahogen

1

Перше, що слід перевірити, це дозвіл на файл /etc/sslта /etc/ssl/certs.

Я допустив помилку, коли викидав дозволи на файли (або здував rm -rf /etc/ssl/*каталоги SSL ) під час використання ssl-certімені / ідентифікатора групи під час роботи над моїм інструментом управління сертифікаційним органом .

Саме тоді я помітив , що точно таке ж повідомлення про помилку для wgetі curlCLI інструментів браузера:

server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

Як тільки я довів дозвіл на файли /etc/sslта /etc/ssl/certкаталоги o+rx-w, ці інструменти браузера CLI почали дихати трохи легше:

mkdir -p /etc/ssl/certs
chmod u+rwx,go+rx /etc/ssl /etc/ssl/certs

Мені також довелося відтворити підкаталог Java і реконструювати довірені сертифікати довірених сертифікатів CA:

mkdir /etc/ssl/certs/java
chmod u+rwx,go+rx /etc/ssl/certs/java
update-ca-certificates

і узбережжя було ясним.


0

Я щойно стикався з тією самою проблемою з git сховища, яке завжди працює для мене. Проблема полягала в тому, що я отримав доступ до нього через загальнодоступний Wi-Fi доступ, який перенаправляє на захоплений портал при першому підключенні (наприклад, щоб показувати рекламу та погоджуватися з тонами).


0

Скопіюйте сертифікат і пакет у один .crt-файл і переконайтеся, що між сертифікатами у файлі є порожній рядок.

Це працювало для мене на сервері GitLab після того, як спробував все в Інтернеті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.