konfigurasikan Git untuk menerima sertifikat server yang ditandatangani sendiri untuk remote https tertentu

167

Sysadmin untuk proyek yang sedang saya jalani memutuskan bahwa SSH "terlalu banyak masalah"; sebagai gantinya, ia telah mengatur Git agar dapat diakses melalui https://URL (dan otentikasi nama pengguna / kata sandi). Server untuk URL ini menyajikan sertifikat yang ditandatangani sendiri, jadi dia menyarankan semua orang untuk mematikan validasi sertifikat. Ini tidak menurut saya pengaturan yang baik, keamanan-bijaksana.

Apakah mungkin untuk memberi tahu Git bahwa untuk remote X (atau lebih baik, remote di repositori mana pun yang dimulai https://$SERVERNAME/) itu adalah untuk menerima sertifikat tertentu, dan hanya sertifikat itu? Pada dasarnya menggandakan perilaku kunci-server SSH.

zwol
sumber
Anda bertanya tentang C Git di Unix, saya kira?
Piotr Findeisen
Yah. Yah, bisa dibayangkan juga Windows, tetapi tidak ada yang melakukan itu sekarang.
zwol
5
WTF? @Zack, Anda benar sepenuhnya tentang pemeriksaan sertifikat. Ketika admin Anda mengatakan Anda harus mematikan pemeriksaan sertifikat, ia juga dapat mematikan TLS di server, karena setiap orang menonaktifkan perlindungan terhadap serangan manusia-di-tengah.
Rudi
@Rudi, apakah ini masih terjadi jika mereka menggunakan alamat IP untuk mengakses server? (Sepertinya pencarian DNS adalah bagaimana MITM mendapatkan peralihan jadi saya pikir alamat IP harus kebal terhadap ini.)
Chris
6
@ Chris Ya, masih demikian. Router MITM dapat berpura-pura menjadi alamat IP yang mereka inginkan. (Anda tahu halaman interstisial yang Anda dapatkan di wifi gratis di bandara? Itu adalah MITM. Coba akses suatu halaman dengan alamat IP kapan-kapan.)
zwol

Jawaban:

295

Secara singkat:

  1. Dapatkan sertifikat yang ditandatangani sendiri
  2. Masukkan ke dalam beberapa ~/git-certs/cert.pemfile (misalnya )
  3. Setel gituntuk mempercayai sertifikat ini menggunakan http.sslCAInfoparameter

Lebih detail:

Dapatkan sertifikat server jarak jauh yang ditandatangani sendiri

Dengan asumsi, URL server adalah repos.sample.comdan Anda ingin mengaksesnya melalui port 443.

Ada beberapa opsi, bagaimana cara mendapatkannya.

Dapatkan sertifikat menggunakan openssl

$ openssl s_client -connect repos.sample.com:443

Tangkap output ke dalam file cert.pemdan hapus semua kecuali bagian antara (dan termasuk) -BEGIN CERTIFICATE-dan-END CERTIFICATE-

Konten file yang dihasilkan ~ / git-certs / cert.pem mungkin terlihat seperti ini:

-----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-----

Dapatkan sertifikat menggunakan browser web Anda

Saya menggunakan Redmine dengan repositori Git dan saya mengakses URL yang sama untuk UI web dan untuk akses baris perintah git. Dengan cara ini, saya harus menambahkan pengecualian untuk domain itu ke dalam browser web saya.

Menggunakan Firefox, saya pergi ke Options -> Advanced -> Certificates -> View Certificates -> Servers, menemukan ada host yang ditandatangani sendiri, memilihnya dan menggunakan Exporttombol saya mendapatkan file yang persis sama, seperti yang dibuat menggunakan openssl.

Catatan: Saya sedikit terkejut, tidak ada nama otoritas yang disebutkan. Ini baik

Memiliki sertifikat tepercaya dalam file khusus

Langkah sebelumnya akan menghasilkan sertifikat dalam beberapa file. Tidak masalah, file apa itu asalkan dapat dilihat oleh git Anda saat mengakses domain itu. Saya menggunakan~/git-certs/cert.pem

Catatan: Jika Anda membutuhkan lebih banyak sertifikat yang ditandatangani sendiri secara tepercaya, masukkan ke dalam file yang sama:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Ini akan berhasil (tapi saya mengujinya hanya dengan sertifikat tunggal).

Konfigurasikan git untuk mempercayai sertifikat ini

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

Anda juga dapat mencoba melakukan sistem itu secara luas, menggunakan --systemalih-alih --global.

Dan mengujinya: Anda sekarang dapat berkomunikasi dengan server Anda tanpa menggunakan:

$ git config --global http.sslVerify false #NO NEED TO USE THIS

Jika Anda sudah mengatur git Anda untuk mengabaikan sertifikat ssl, hapus itu:

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

dan Anda juga dapat memeriksa, bahwa Anda melakukan semuanya dengan benar, tanpa kesalahan pengejaan:

$ git config --global --list

apa yang harus mendaftar semua variabel, Anda telah menetapkan secara global. (Saya salah mengeja http ke htt).

Jan Vlcinsky
sumber
1
Saya pikir jawaban ini lebih benar dan lengkap daripada jawaban yang diterima. Terima kasih @ Jan Vlcinsky
Alfredo Cavalcanti
1
Setelah itu sertifikat yang ditandatangani otoritas biasanya berhenti bekerja, jadi saya tidak bisa menarik mis. Dari Github. Apakah ada cara untuk menambahkan sertifikat yang ditandatangani sendiri tanpa mematikan otoritas yang ditandatangani?
Michael Ivko
4
Solusi @MichaelIvko yang memperhitungkan 'sertifikat bertanda tangan biasa' yang dijelaskan di sini (Anda perlu menambahkan sertifikat Anda ke file 'curl-ca-bundle.crt'): blogs.msdn.com/b/phkelley/archive/2014/
01/20
3
Masalah dengan pendekatan ini adalah bahwa ia secara efektif menghapus semua CA default yang datang dengan git (mis. Setelah melakukan ini, Anda tidak akan dapat menarik dari github). Kemungkinan besar bukan itu yang paling dicari. Contoh yang lebih baik adalah menambahkan CA root baru ke salinan Git \ bin \ curl-ca-bundle.crt, dan kemudian referensi salinan baru curl-ca-bundle.crt dari gitconfig Anda.
Crimbo
3
itu bekerja di windows! ekspor setiap sertifikat dalam rantai sertifikat sebagai file X649 berkode Base64 (.CER) Letakkan semua file bersama-sama dan referensi file ini. Pastikan Anda tidak memiliki spasi di jalur ke file cert (gunakan jalur oldschool)
pscheit
3

Penyesuaian Pengguna OSX.

Mengikuti langkah-langkah dari jawaban yang Diterima bekerja untuk saya dengan tambahan kecil ketika mengkonfigurasi pada OSX.

Saya meletakkan cert.pemfile dalam direktori di bawah OSX saya pengguna login dan dengan demikian membuat saya menyesuaikan lokasi untuk sertifikat tepercaya.

Konfigurasikan git untuk mempercayai sertifikat ini:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Chris Langston
sumber