verifikasi sertifikat server gagal. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: tidak ada

335

Saya dapat mendorong proyek klon menggunakan ssh, tetapi tidak berfungsi ketika saya mengkloning proyek dengan https.

Pesan kesalahan yang menunjukkan kepada saya adalah:

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

Jawaban:

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"

Jawaban panjang

Alasan dasarnya adalah bahwa komputer Anda tidak mempercayai otoritas sertifikat yang menandatangani sertifikat yang digunakan di server Gitlab . Ini tidak berarti sertifikat mencurigakan, tetapi dapat ditandatangani sendiri atau ditandatangani oleh lembaga / perusahaan yang tidak ada dalam daftar CA OS Anda. Apa yang harus Anda lakukan untuk menghindari masalah di komputer adalah mengatakannya untuk memercayai sertifikat itu - jika Anda tidak punya alasan untuk curiga tentang hal itu.

Anda perlu memeriksa sertifikat web yang digunakan untuk server gitLab Anda, dan menambahkannya ke </git_installation_folder>/bin/curl-ca-bundle.crt.

Untuk memeriksa apakah setidaknya klon bekerja tanpa memeriksa sertifikat tersebut, Anda dapat mengatur:

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

Tapi itu hanya untuk pengujian, seperti yang diilustrasikan dalam " SSL berfungsi dengan browser, wget, dan curl, tetapi gagal dengan git ", atau dalam posting blog ini .

Periksa pengaturan GitLab Anda, dalam edisi 4272 .


Untuk mendapatkan sertifikat itu (yang perlu Anda tambahkan ke curl-ca-bundle.crtfile Anda ), ketikkan:

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

(dengan ' yourserver.commenjadi nama server GitLab Anda, dan biasanya YourHttpsGitlabPortadalah port https 443)

Untuk memeriksa CA (penerbit Otoritas Sertifikat), ketik a:

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

Catatan: Valeriy Katkov menyarankan dalam komentar untuk menambahkan -servernameopsi ke perintah openssl, jika tidak, perintah tersebut tidak menunjukkan sertifikat untuk www.github.com dalam kasus Valeriy.

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

Findekano menambahkan dalam komentar :

untuk mengidentifikasi lokasi curl-ca-bundle.crt, Anda dapat menggunakan perintah

curl-config --ca

Juga, lihat jawaban saya yang lebih baru " github: verifikasi sertifikat server gagal ": Anda mungkin harus memperbarui semua sertifikat itu:

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
VONC
sumber
8
Bukankah pesan asli menunjukkan ke mana harus menambahkan sertifikat? Dalam kasus saya curl-config --cadikembalikan /etc/ssl/certs/ca-certificates.crt, di situlah saya harus menambahkan sertifikat. Terlepas dari itu, jawaban ini adalah informasi pertama yang menunjukkan saya ke arah yang benar dengan masalah ini
uli_1973
1
Bagaimana Anda menemukan folder install git?
Bhargav
1
@Bhargav tergantung pada OS Anda. Di Linux, Anda dapat melakukan a which git.
VonC
3
Saya berlari curl-config --ca, tetapi tidak ada yang dikembalikan.
Fernando Costa
1
Terima kasih atas tipnya - Anda menyelamatkan hari saya.
Janne
220

Catatan: Ini memiliki implikasi keamanan besar .

Buka terminal Anda dan jalankan perintah berikut:

export GIT_SSL_NO_VERIFY=1

Ini bekerja untuk saya dan saya menggunakan sistem Linux.

Afzal Masood
sumber
60
Tidak downvoting karena itu solusi untuk ketika Anda tahu apa yang Anda lakukan. Namun, sangat merekomendasikan hal ini dalam kasus umum.
tripleee
9
Saya tidak akan mengatakan ini solusi ketika Anda tahu apa yang Anda lakukan. Ketika Anda tahu apa yang Anda lakukan, Anda harus melihat sertifikat gagal sebagai "mungkin seseorang meretas kami" tidak "oh baik keamanan mengatakan seseorang meretas kami, kira kami perlu menonaktifkan keamanan." Paling-paling merupakan langkah sementara jika sesuatu perlu didorong secepatnya.
srcspider
1
dengan mengekspor flag di atas saya mendapatkan di bawah error.error: RPC gagal; hasil = 22, kode HTTP = 403 fatal: Ujung jarak jauh menutup kesalahan yang tidak terduga: RPC gagal; hasil = 22, kode HTTP = 403 fatal: Ujung jarak jauh menutup secara tak terduga
Desu
8
Hanya bekerja untuk saya dengangit config --global http.sslverify false
Dinei
2
Bagus. Anda menghemat waktu saya.
Sai prateek
146

Penyebab lain dari masalah ini mungkin karena jam Anda mati. Sertifikat sensitif terhadap waktu.

Untuk memeriksa waktu sistem saat ini:

date -R

Anda dapat mempertimbangkan menginstal NTP untuk secara otomatis menyinkronkan waktu sistem dengan server waktu internet tepercaya dari kumpulan NTP global . Misalnya, untuk menginstal di Debian / Ubuntu:

apt-get install ntp
davidthings
sumber
5
Ini masalah saya. Universitas saya memblokir paket ntp, yang mencegah sistem saya memperbarui waktu. Setelah saya mengonfigurasi server ntp universitas segalanya berjalan kembali. Terima kasih atas tip ini!
Kyle
3
Ini juga penyebab masalah saya, saya menggunakan perangkat tertanam yang memiliki tanggal yang salah!
Shervin Emami
Ini adalah masalah saya, dengan sertifikat. Saya menghabiskan berjam-jam mencari segala macam solusi sebelum menemukan bahwa masalahnya adalah jam server sedang diatur ke masa depan. Namun, itu tidak membantu saya mendapatkan Node.js di masa mendatang. :-(
Kevin Teljeur
1
@ Katu itu bukan gitper mengatakan, itu adalah pertukaran SSL yang mendasarinya. Git dibangun dengan dukungan SSL.
Yvan
1
Saya telah memperbaiki ini 10000 kali .... mencari mengapa tidak bekerja selama 6 jam penuh sekarang ... Server dimatikan kurang dari 7 menit dan ini berhasil ... TERIMA KASIH!
Lakukan
66

Jika Anda menggunakan server git di dalam jaringan pribadi dan menggunakan sertifikat yang ditandatangani sendiri atau sertifikat di atas alamat IP; Anda juga dapat menggunakan git global config untuk menonaktifkan pemeriksaan ssl:

git config --global http.sslverify "false"
Romain VDK
sumber
43

Punya masalah yang sama. Disebabkan oleh otoritas sertifikat yang diterbitkan sendiri. Mengatasinya dengan menambahkan file .pem ke / usr / local / share / ca-sertifikat / dan menelepon

sudo update-ca-certificates

PS: file pem dalam folder ./share/ca-certificates HARUS memiliki ekstensi .crt

Nikolay Ruban
sumber
2
Bekerja seperti pesona di linux mint 16 :)
greuze
maksud Anda cert.pem atau cert.crt atau cert.pem.crt?
Moses Liao GZ
1
cert.pem harus diganti nama menjadi cert.pem.crt
Nikolay Ruban
34

Periksa jam sistem Anda,

$ date

Jika tidak benar, cek sertifikat akan gagal. Untuk memperbaiki jam sistem,

$ apt-get install ntp

Jam harus menyinkronkan dirinya sendiri.

Akhirnya masukkan perintah klon lagi.

mycowan
sumber
1
Iya! Saya memiliki instance Ubuntu yang diskors di VirtualBox untuk waktu yang lama. Jam sistem tidak melakukan sinkronisasi untuk alasan apa pun ketika saya tidak ditangguhkan. Jawaban VonC tampaknya berpengetahuan luas, tetapi saya sangat senang saya tidak harus menjalankan banyak perintah keamanan yang tidak saya mengerti. Periksa ini dulu!
AndyJost
24
GIT_CURL_VERBOSE=1 git [clone|fetch]…

harus memberi tahu Anda di mana masalahnya. Dalam kasus saya itu adalah karena CURL tidak mendukung sertifikat PEM ketika dibangun terhadap NSS, karena dukungan itu tidak menjadi arus utama di NSS ( # 726116 # 804215 # 402712 dan lebih banyak lagi ).

Tobu
sumber
4
Tambahan yang bagus dengan GIT_CURL_VERBOSE. Saya tidak menyebutkannya dalam jawaban saya. +1
VonC
18

Atau jalankan komentar ini untuk menambahkan Sertifikat server ke database Anda:

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

Lalu lakukan git klon lagi.

phiphu
sumber
1
Saya tidak tahu apakah ini bekerja untuk siapa pun tetapi saya perlu "tee" untuk menambahkan file cert sebagai root: echo -n | openssl s_client -showcerts -connect yourserver.com:443 2> / dev / null | sed -ne '/ -BEGIN CERTIFICATE - /, / - END CERTIFICATE- / p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
ywu
Dalam kasus saya, server memiliki sertifikat yang valid, tetapi database saya tidak memasukkannya, dengan perintah ini saya selesaikan tetapi saya harus mengatakan bahwa perintah ini harus dijalankan dengan hak akses root.
hermeslm
10

Saya mengacaukan file CA saya saat saya menyiapkan proxy goagent. Tidak dapat menarik data dari github, dan mendapatkan peringatan yang sama:

verifikasi sertifikat server gagal. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: tidak ada

gunakan metode Vonc, dapatkan sertifikat dari github, dan masukkan ke /etc/ssl/certs/ca-certificates.crt, masalah terpecahkan.

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

IFQ
sumber
8

tidak perlu mengatur verifikasi git ssl untuk disetel ke false. Ini disebabkan ketika sistem tidak memiliki semua sertifikat otoritas CA. Sebagian besar orang yang memiliki sertifikat SSL asli kehilangan sertifikat perantara.

Hanya menambahkan teks lengkap sertifikat perantara (seluruh rantai CA hilang dan sertifikat perantara) ke

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

bekerja tanpa menjalankan update-ca-certificates.

Hal yang sama berlaku untuk sertifikat yang dibuat secara manual, cukup tambahkan teks sertifikat CA.

Pada akhirnya: Dorong berhasil: Semuanya mutakhir

abcdef12
sumber
1
Hal yang sama dapat terjadi jika server tidak dikonfigurasi dengan benar dengan semua rantai CA CA.
abcdef12
Masalah rantai dapat menjadi penyebabnya, seperti yang dikomentari abcdef12. Saya punya masalah dengan git 1.9.1 - server mengirim rantai sertifikat: # 0 server cert; Cert server # 1 (lagi); Sertifikat penandatangan # 2. Duplikat dalam rantai adalah alasan git tidak menyukainya.
jah
8

Apa yang saya lakukan untuk mengatasi masalah ini di terminal (Ubuntu 18.04):

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

Saya mendapat dua bongkahan bongkahan sertifikat. Dan saya menyalin potongan sertifikat ke file sertifikat saya ke /etc/ssl/certs/ca-certificates.crt.

mindcoder
sumber
Solusi ini menyelesaikan masalah identik saya di Ubuntu 16.04.
user3072843
Apa sebenarnya yang Anda maksud dengan potongan sertifikat ? Blok antara ---BEGIN CERTIFICATE---dan --- END CERTIFICATE ---?
B - rian
3

Saya menginstal Xubuntu pada Raspberry pi 2, menemukan masalah yang sama dengan waktu, karena sinkronisasi NTP dan Server Otomatis mati (atau tidak diinstal). Dapatkan NTP

sudo apt-get install ntp

dan ubah "Waktu dan Tanggal" dari "Manual" menjadi "Tetap disinkronkan dengan Server Internet"

pengguna273711
sumber
1

Akhirnya, tambahkan http.sslverify ke .git / config Anda.

[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
Mickael L.
sumber
1
Lebih baik menggunakan baris perintah git config http.sslVerify false. Apakah Anda menyarankan edit konfigurasi Git berdasarkan per-repositori, tidak secara global seperti yang disarankan oleh @ romain-vdk?
Ahogen
1

Hal pertama yang harus Anda periksa adalah izin file dari /etc/ssldan /etc/ssl/certs.

Saya melakukan kesalahan dengan menjatuhkan izin file (atau membuang rm -rf /etc/ssl/*direktori SSL ) ketika menggunakan ssl-certnama grup / ID saat bekerja pada Alat Manajemen Otoritas Sertifikat saya .

Saat itulah saya melihat pesan kesalahan yang sama persis untuk wgetdan curlalat browser CLI:

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

Setelah saya membawa izin file /etc/ssldan /etc/ssl/certdirektori ' o+rx-w, alat-alat browser CLI mulai bernafas sedikit lebih mudah:

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

Saya juga harus membuat ulang subdirektori Java dan merekonstruksi direktori sertifikat CA Tepercaya:

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

dan pantainya jernih.

John Greene
sumber
0

Saya baru saja mengalami masalah yang sama dengan repositori git yang selalu bekerja untuk saya. Masalahnya adalah saya mengaksesnya melalui akses WiFi publik, yang dialihkan ke portal captive pada koneksi pertama (misalnya untuk menampilkan iklan dan setuju dengan tos).

Tosha
sumber
0

Apakah sertifikat dan bundel disalin dalam satu file .crt dan pastikan bahwa ada garis kosong antara sertifikat dalam file.

Ini bekerja untuk saya di server GitLab setelah mencoba semuanya di Internet.

shambhu
sumber