การตรวจสอบใบรับรองเซิร์ฟเวอร์ล้มเหลว CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none


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 นี่ไม่ได้หมายความว่าใบรับรองนั้นน่าสงสัย แต่อาจเป็นการลงนามด้วยตนเองหรือลงนามโดยสถาบัน / บริษัท ที่ไม่ได้อยู่ในรายชื่อ CA ของระบบปฏิบัติการของคุณ สิ่งที่คุณต้องทำเพื่อหลีกเลี่ยงปัญหาที่เกิดขึ้นกับคอมพิวเตอร์ของคุณกำลังบอกให้เชื่อถือใบรับรองนั้น - หากคุณไม่มีเหตุผลใด ๆ ที่ต้องสงสัยเกี่ยวกับมัน

คุณต้องตรวจสอบใบรับรองเว็บที่ใช้สำหรับเซิร์ฟเวอร์ 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ไฟล์ของคุณ) ให้พิมพ์ a:

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

หมายเหตุ: Valeriy Katkovแนะนำในข้อคิดเห็นเพื่อเพิ่ม-servernameตัวเลือกคำสั่ง openssl มิฉะนั้นคำสั่งจะไม่แสดงใบรับรองสำหรับ www.github.com ในกรณีของ Valeriy

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

Findekanoเพิ่มในความคิดเห็น :

เพื่อระบุตำแหน่งของcurl-ca-bundle.crtคุณสามารถใช้คำสั่ง

curl-config --ca

โปรดดูคำตอบล่าสุดของฉัน " github: การตรวจสอบใบรับรองเซิร์ฟเวอร์ล้มเหลว ": คุณอาจต้องยกเลิกใบรับรองเหล่านั้นทั้งหมด:

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
คุณจะพบโฟลเดอร์การติดตั้งคอมไพล์ได้อย่างไร?
Bhargav

1
@Bhargav มันขึ้นอยู่กับระบบปฏิบัติการของคุณ บน Linux which gitที่คุณสามารถทำได้
VonC

3
ฉันวิ่งcurl-config --caแต่ไม่มีอะไรกลับมา
Fernando Costa

1
ขอบคุณสำหรับเคล็ดลับ - คุณช่วยชีวิตฉันไว้
Janne

220

หมายเหตุ:นี้มีที่สำคัญผลกระทบการรักษาความปลอดภัย

เปิดเทอร์มินัลของคุณและเรียกใช้คำสั่งต่อไปนี้:

export GIT_SSL_NO_VERIFY=1

มันทำงานได้สำหรับฉันและฉันใช้ระบบ Linux


60
ไม่ใช่การลงคะแนนเนื่องจากเป็นการแก้ปัญหาเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ อย่างไรก็ตามขอแนะนำอย่างยิ่งในกรณีทั่วไป
tripleee

9
ฉันจะไม่บอกว่ามันเป็นวิธีแก้ปัญหาเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ เมื่อคุณรู้ว่าคุณกำลังทำอะไรคุณควรดูใบรับรองที่ล้มเหลวเนื่องจาก "อาจมีบางคนที่แฮ็กเรา" ไม่ใช่ "โอ้ความปลอดภัยบอกว่ามีคนแฮกเราคิดว่าเราต้องปิดการรักษาความปลอดภัย" เป็นการวัดที่ดีที่สุดหากมีสิ่งที่ต้องการผลักดันโดยเร็วที่สุด
srcspider

1
โดยการส่งออกธงด้านบนฉันได้รับด้านล่าง error.error: RPC ล้มเหลว; result = 22, รหัส HTTP = 403 ร้ายแรง: สิ้นสุดระยะไกลวางสายผิดพลาดโดยไม่คาดคิด: RPC ล้มเหลว; ผล = 22, รหัส HTTP = 403 ถึงแก่ชีวิต: ปลายระยะไกลวางสายโดยไม่คาดคิด
Desu

7
ทำงานให้ฉันด้วยgit config --global http.sslverify false
Dinei

2
ยิ่งใหญ่ คุณประหยัดเวลาของฉัน
Sai prateek

146

สาเหตุอื่นของปัญหานี้อาจเป็นเพราะนาฬิกาของคุณอาจถูกปิด ใบรับรองมีความไวต่อเวลา

วิธีตรวจสอบเวลาของระบบปัจจุบัน:

date -R

คุณอาจพิจารณาติดตั้งNTPโดยอัตโนมัติซิงค์เวลาของระบบที่มี timeservers อินเทอร์เน็ตที่เชื่อถือได้จากสระว่ายน้ำ NTP ทั่วโลก ตัวอย่างเช่นการติดตั้งบน Debian / Ubuntu:

apt-get install ntp

5
นี่เป็นปัญหาของฉัน มหาวิทยาลัยของฉันปิดกั้นแพ็คเก็ต ntp ซึ่งทำให้ระบบของฉันอัปเดตเวลาไม่ได้ เมื่อฉันกำหนดค่าสิ่งที่เซิร์ฟเวอร์มหาวิทยาลัย ntp ทำงานได้อีกครั้ง ขอบคุณสำหรับเคล็ดลับนี้!
Kyle

3
นี่ก็เป็นสาเหตุของปัญหาของฉันฉันใช้อุปกรณ์ฝังตัวที่มีวันที่ไม่ถูกต้อง!
Shervin Emami

นี่คือปัญหาของฉันกับคอนเสิร์ต ฉันใช้เวลาหลายชั่วโมงเพื่อดูวิธีแก้ปัญหาทุกประเภทก่อนที่จะพบว่าปัญหาคือนาฬิกาของเซิร์ฟเวอร์ถูกกำหนดไว้ในอนาคต อย่างไรก็ตามมันไม่ได้ช่วยให้ฉันได้รับ Node.js ในอนาคต :-(
Kevin Teljeur

1
@ Katu มันไม่ได้เป็นgitต่อการแลกเปลี่ยน SSL พื้นฐาน Git สร้างขึ้นด้วยการรองรับ SSL
Yvan

1
ฉันลงทะเบียน 10,000 ครั้งนี้ได้รับการมองว่าทำไมมันไม่ทำงานเป็นเวลา 6 ชั่วโมงตอนนี้ ... เซิร์ฟเวอร์ถูกปิดโดยน้อยกว่า 7 นาทีและสิ่งนี้ได้หลอกลวง ... ขอบคุณ!
dGo

66

หากคุณกำลังใช้เซิร์ฟเวอร์ git ภายในเครือข่ายส่วนตัวและกำลังใช้ใบรับรองที่ลงนามด้วยตนเองหรือใบรับรองผ่านที่อยู่ IP คุณสามารถใช้ git global config เพื่อปิดการใช้งานการตรวจสอบ ssl:

git config --global http.sslverify "false"

43

มีปัญหาเดียวกัน เกิดจากผู้ออกใบรับรองด้วยตนเอง แก้ไขได้โดยการเพิ่มไฟล์. pem ไปยัง/ usr / local / share / ca-certificate / และการโทร

sudo update-ca-certificates

PS: ไฟล์ pem ในโฟลเดอร์. / แชร์ /ca-certificates ต้องมีนามสกุล. crt


2
ทำงานเหมือนเสน่ห์ในลินุกซ์มิ้นท์ 16 :)
Greuze

คุณหมายถึง cert.pem หรือ cert.crt หรือ cert.pem.crt?
Moses Liao GZ

1
cert.pem ควรเปลี่ยนชื่อเป็น cert.pem.crt
Nikolay Ruban

34

ตรวจสอบนาฬิการะบบของคุณ

$ date

หากไม่ถูกต้องการตรวจสอบใบรับรองจะล้มเหลว เพื่อแก้ไขนาฬิการะบบ

$ apt-get install ntp

นาฬิกาควรซิงโครไนซ์ตัวเอง

ในที่สุดป้อนคำสั่ง clone อีกครั้ง


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

จากนั้นทำการคอมไพล์อีกครั้ง


1
ฉันไม่ทราบว่าสิ่งนี้ใช้ได้กับทุกคนหรือไม่ แต่ฉันต้องการ "tee" เพื่อผนวกไฟล์ใบรับรองเป็น root: echo -n | openssl s_client -showcerts -connect yourserver.com:443 2> / dev / null | sed -ne '/ -BEGIN ใบรับรอง - /, / - ใบรับรองสิ้นสุด - / p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt
ywu

ในกรณีของฉันเซิร์ฟเวอร์มีใบรับรองที่ถูกต้อง แต่ฐานข้อมูลของฉันไม่รวมกับคำสั่งนี้ฉันแก้ไข แต่ฉันต้องบอกว่าคำสั่งนี้จะต้องทำงานด้วยสิทธิ์พิเศษ
hermeslm

10

ฉันทำกับไฟล์ CA ของฉันในขณะที่ตั้งค่าพร็อกซี goagent ไม่สามารถดึงข้อมูลจาก GitHub และรับคำเตือนที่เหมือนกัน:

การตรวจสอบใบรับรองเซิร์ฟเวอร์ล้มเหลว CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

ใช้วิธีการของ Vonc รับใบรับรองจาก github และใส่ลงใน /etc/ssl/certs/ca-certificates.crt แก้ไขปัญหา

echo -n | openssl s_client -showcerts -connect github.com:443 2> / dev / null | sed -ne '/ - เริ่มต้นใบรับรอง - /, / - ใบรับรองสิ้นสุด - / p'


8

ไม่จำเป็นต้องตั้งค่าการตรวจสอบ git ssl เป็นตั้งค่าเป็นเท็จ มันเกิดขึ้นเมื่อระบบไม่มีใบรับรอง CA ทั้งหมด คนส่วนใหญ่ที่มีใบรับรอง SSL ของแท้ไม่มีใบรับรองระดับกลาง

เพียงแค่เพิ่มข้อความฉบับสมบูรณ์ของใบรับรองระดับกลาง (ทั้งเชนของ CA ที่ขาดหายไปและใบรับรองระดับกลาง) ไปที่

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

update-ca-certificatesทำงานโดยไม่มีการเรียกใช้

กันไปสำหรับใบรับรองที่สร้างขึ้นด้วยตนเองเพียงแค่เพิ่มข้อความใบรับรอง CA

ในตอนท้าย: กดสำเร็จ: ทุกอย่างเป็นปัจจุบัน


1
อาจเกิดขึ้นได้เช่นกันหากเซิร์ฟเวอร์ไม่ได้รับการกำหนดค่าอย่างถูกต้องกับ SSL CA เชนทั้งหมด
abcdef12

ปัญหาลูกโซ่อาจเป็นสาเหตุตามที่ abcdef12 แสดงความคิดเห็น ฉันมีปัญหากับ git 1.9.1 นี้ - เซิร์ฟเวอร์ส่งใบรับรองเชน: # 0 เซิร์ฟเวอร์รับรอง; ใบรับรองเซิร์ฟเวอร์ # 1 (อีกครั้ง); ใบรับรองผู้ลงนาม # 2 การซ้ำซ้อนในโซ่คือเหตุผลที่คอมไพล์ไม่ชอบ
jah

8

สิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้ใน terminal (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 ---?
B - rian

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

ฉันทำผิดพลาดของการวางสิทธิ์ของแฟ้ม (หรือเป่าไป SSL ที่rm -rf /etc/ssl/*ไดเรกทอรี) เมื่อใช้ssl-certชื่อกลุ่ม / ID ในขณะที่ทำงานบนของเครื่องมือการจัดการใบรับรอง

ตอนนั้นเองที่ผมสังเกตเห็นข้อผิดพลาดเดียวกันที่แน่นอนสำหรับการwgetและcurlเครื่องมือเบราว์เซอร์ CLI:

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 ซึ่งใช้ได้กับฉันเสมอ ปัญหาคือว่าฉันเข้าถึงผ่านการเข้าถึง WiFi สาธารณะซึ่งเปลี่ยนเส้นทางไปยังพอร์ทัลเชลยเมื่อเชื่อมต่อครั้งแรก (ตัวอย่างเช่นเพื่อแสดงโฆษณาและเห็นด้วยกับ tos)


0

ให้คัดลอกใบรับรองและบันเดิลในไฟล์. crt ไฟล์เดียวและตรวจสอบให้แน่ใจว่ามีบรรทัดว่างระหว่างใบรับรองในไฟล์

สิ่งนี้ใช้ได้กับฉันบนเซิร์ฟเวอร์ GitLab หลังจากลองทุกอย่างบนอินเทอร์เน็ต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.