กำหนดค่า Git ให้ยอมรับใบรับรองเซิร์ฟเวอร์ที่ลงนามเองโดยเฉพาะสำหรับ https ระยะไกลโดยเฉพาะ


167

ดูแลระบบสำหรับโครงการที่ฉันได้ตัดสินใจแล้วว่า SSH เป็น "ปัญหามากเกินไป"; แต่เขาได้ตั้งค่า Git ให้สามารถเข้าถึงได้ผ่านhttps://URL (และการตรวจสอบชื่อผู้ใช้ / รหัสผ่าน) เซิร์ฟเวอร์สำหรับ URL นี้แสดงใบรับรองที่ลงชื่อด้วยตนเองดังนั้นเขาจึงแนะนำให้ทุกคนปิดการตรวจสอบใบรับรอง สิ่งนี้ไม่ได้รบกวนฉันในเรื่องการตั้งค่าที่ดีความปลอดภัย

เป็นไปได้หรือไม่ที่จะบอก Git ว่า remote X (หรือดีกว่า remote ใด ๆ ในที่เก็บใด ๆ ที่เกิดขึ้นเมื่อเริ่มต้นด้วยhttps://$SERVERNAME/) ต้องยอมรับใบรับรองเฉพาะและใบรับรองนั้นเท่านั้น ? โดยทั่วไปจะทำซ้ำการทำงานของคีย์เซิร์ฟเวอร์ของ SSH


คุณกำลังถามเกี่ยวกับ C Git บน Unix ฉันเข้าใจไหม?
Piotr Findeisen

ย่ะ ก็น่าจะเป็น Windows ก็ได้ แต่ตอนนี้ไม่มีใครทำ
zwol

5
WTF? @ แซคคุณถูกต้องแน่นอนเกี่ยวกับการตรวจสอบใบรับรอง เมื่อผู้ดูแลระบบของคุณบอกว่าคุณควรปิดการตรวจสอบใบรับรองเขายังสามารถปิด TLS บนเซิร์ฟเวอร์ได้เนื่องจากทุกคนจะปิดการใช้งานการป้องกันการโจมตีจากคนกลาง
ฤดี

@Rudi เป็นกรณีนี้หรือไม่หากใช้ที่อยู่ IP เพื่อเข้าถึงเซิร์ฟเวอร์ (ดูเหมือนว่าการค้นหา DNS คือวิธีที่ MITM เข้ามาระหว่างดังนั้นฉันคิดว่าที่อยู่ IP ควรมีภูมิคุ้มกันต่อสิ่งนี้)
Chris

6
@ Chris ใช่มันยังคงเป็นกรณี เราเตอร์ MITM สามารถทำเป็นที่อยู่ IP ใด ๆ ที่พวกเขาต้องการ (คุณรู้ว่าหน้าคั่นระหว่างหน้าเหล่านั้นที่คุณได้รับจาก wifi ฟรีในสนามบินคือ MITMs ลองเข้าใช้หน้าเว็บด้วยที่อยู่ IP ในบางครั้ง)
zwol

คำตอบ:


295

สั้น ๆ :

  1. รับใบรับรองที่ลงนามด้วยตนเอง
  2. ใส่ลงใน~/git-certs/cert.pemไฟล์(เช่น) บางไฟล์
  3. ตั้งค่าgitให้เชื่อถือใบรับรองนี้โดยใช้http.sslCAInfoพารามิเตอร์

รายละเอียดเพิ่มเติม:

รับใบรับรองที่ลงนามด้วยตนเองของเซิร์ฟเวอร์ระยะไกล

สมมติว่า URL ของเซิร์ฟเวอร์และคุณต้องการที่จะเข้าถึงได้ผ่านพอร์ตrepos.sample.com443

มีหลายวิธีให้เลือก

รับใบรับรองโดยใช้ 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 เดียวกันสำหรับเว็บ UI และสำหรับการเข้าถึงบรรทัดคำสั่ง 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

หากคุณตั้งค่าคอมไพล์ของคุณเป็นความไม่รู้ของใบรับรอง SSL ให้ยกเลิกการตั้งค่า:

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

และคุณอาจตรวจสอบว่าคุณทำถูกต้องทั้งหมดโดยไม่มีข้อผิดพลาดการสะกด:

$ git config --global --list

สิ่งที่ควรแสดงรายการตัวแปรทั้งหมดที่คุณตั้งไว้ทั่วโลก (ฉันสะกด http เป็น htt)


1
ฉันคิดว่าคำตอบนี้ถูกต้องและสมบูรณ์กว่าคำตอบที่ยอมรับ ขอบคุณ @Jan Vlcinsky
Alfredo Cavalcanti

1
หลังจากนั้นใบรับรองที่ลงนามโดยผู้มีอำนาจตามปกติจะหยุดทำงานดังนั้นฉันจึงไม่สามารถดึงเช่นจาก Github มีวิธีเพิ่มใบรับรองที่เซ็นชื่อเองโดยไม่ปิดการเซ็นรับรองหรือไม่
Michael Ivko

4
โซลูชัน @MichaelIvko ที่คำนึงถึง 'ใบรับรองที่ลงนามโดยผู้มีอำนาจตามปกติ' ที่นี่ (คุณต้องเพิ่มใบรับรองของคุณไปที่ไฟล์ 'curl-ca-bundle.crt'): blogs.msdn.com/b/phkelley/archive/2014/
01/20

3
ปัญหาของวิธีนี้คือการลบ CA เริ่มต้นทั้งหมดที่มาพร้อมกับคอมไพล์อย่างมีประสิทธิภาพ (เช่นหลังจากทำเช่นนี้คุณจะไม่สามารถดึงจาก GitHub ได้) เป็นไปได้มากว่าไม่ใช่สิ่งที่คนส่วนใหญ่มองหา ตัวอย่างที่ดีกว่าคือการเพิ่ม root CA ใหม่ลงในสำเนาของ Git \ bin \ curl-ca-bundle.crt จากนั้นอ้างอิงสำเนาใหม่ของ curl-ca-bundle.crt จาก gitconfig ของคุณ
crimbo

3
มันทำงานบน windows! เอ็กซ์พอร์ตทุกใบรับรองในห่วงโซ่ใบรับรองเป็นไฟล์ X.509 ที่เข้ารหัสแล้ว (.CER) Base64 ใส่ไฟล์ทั้งหมดเข้าด้วยกันและอ้างอิงไฟล์นี้ ตรวจสอบให้แน่ใจว่าคุณไม่มีช่องว่างในพา ธ ไปยังไฟล์ใบรับรอง (ใช้เส้นทาง oldschool)
pscheit

3

การปรับตัวของผู้ใช้ OSX

ทำตามขั้นตอนของคำตอบที่ยอมรับได้สำหรับฉันด้วยการเพิ่มเล็กน้อยเมื่อกำหนดค่าบน OSX

ฉันวางcert.pemไฟล์ไว้ในไดเรกทอรีภายใต้ชื่อผู้ใช้ที่ลงชื่อเข้าใช้ด้วย OSX และทำให้ฉันต้องปรับตำแหน่งของใบรับรองที่เชื่อถือได้

กำหนดค่า git เพื่อเชื่อถือใบรับรองนี้:

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