định cấu hình Git để chấp nhận chứng chỉ máy chủ tự ký cụ thể cho một điều khiển https cụ thể


167

Sysadmin cho một dự án tôi đang thực hiện đã quyết định rằng SSH là "quá nhiều rắc rối"; thay vào đó, anh ta đã thiết lập Git để có thể truy cập thông qua một https://URL (và xác thực tên người dùng / mật khẩu). Máy chủ cho URL này xuất trình chứng chỉ tự ký, vì vậy ông khuyên mọi người nên tắt xác thực chứng chỉ. Điều này không tấn công tôi như một thiết lập tốt, bảo mật-khôn ngoan.

Có thể nói với Git rằng đối với điều khiển từ xa X (hoặc tốt hơn, bất kỳ điều khiển từ xa nào trong bất kỳ kho lưu trữ nào bắt đầu https://$SERVERNAME/) thì đó là chấp nhận một chứng chỉ cụ thể và chỉ chứng chỉ đó? Về cơ bản lặp lại hành vi khóa máy chủ của SSH.


Bạn đang hỏi về C Git trên Unix, tôi đoán vậy?
Piotr Findeisen

Yah Vâng, có thể hình dung cũng là Windows, nhưng không ai đang làm điều đó ngay bây giờ.
zwol

5
WTF? @Zack bạn hoàn toàn đúng về việc kiểm tra chứng chỉ. Khi quản trị viên của bạn nói rằng bạn nên tắt kiểm tra chứng chỉ, anh ta cũng có thể tắt TLS trên máy chủ, vì sau đó mọi người đều vô hiệu hóa bảo vệ chống lại cuộc tấn công trung gian.
Rudi

@Rudi, đây có phải là trường hợp nếu họ sử dụng địa chỉ IP để truy cập máy chủ không? (Có vẻ như việc tra cứu DNS là cách MITM kết nối giữa chừng nên tôi nghĩ địa chỉ IP nên miễn nhiễm với điều này.)
Chris

6
@Chris Vâng, nó vẫn là trường hợp. Một bộ định tuyến MITM có thể giả vờ là bất kỳ địa chỉ IP nào họ muốn. (Bạn có biết những trang xen kẽ mà bạn có trên wifi miễn phí trong sân bay không? Đó là những MITM. Thỉnh thoảng hãy thử truy cập một trang bằng địa chỉ IP.)
zwol

Câu trả lời:


295

Tóm tắt:

  1. Nhận giấy chứng nhận tự ký
  2. Đặt nó vào một số ~/git-certs/cert.pemtập tin (ví dụ )
  3. Đặt gitđể tin tưởng chứng chỉ này bằng http.sslCAInfotham số

Trong chi tiết:

Nhận chứng chỉ tự ký của máy chủ từ xa

Giả sử, URL máy chủ là repos.sample.comvà bạn muốn truy cập nó qua cổng 443.

Có nhiều lựa chọn, làm thế nào để có được nó.

Nhận chứng chỉ bằng openssl

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

Bắt đầu ra thành một tệp cert.pemvà xóa tất cả trừ một phần giữa (và bao gồm) -BEGIN CERTIFICATE--END CERTIFICATE-

Nội dung của tệp kết quả ~ / git-certs / cert.pem có thể trông như thế này:

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

Nhận chứng chỉ bằng trình duyệt web của bạn

Tôi sử dụng Redmine với kho Git và tôi truy cập cùng một URL cho giao diện người dùng web và để truy cập dòng lệnh git. Bằng cách này, tôi đã phải thêm ngoại lệ cho tên miền đó vào trình duyệt web của mình.

Sử dụng Firefox, tôi đã đi đến Options -> Advanced -> Certificates -> View Certificates -> Servers, tìm thấy ở đó máy chủ tự gán, đã chọn nó và sử dụng Exportnút tôi nhận được chính xác cùng một tệp, như được tạo bằng cách sử dụng openssl.

Lưu ý: Tôi hơi ngạc nhiên, không có tên của cơ quan được đề cập rõ ràng. Điều này là tốt

Có chứng chỉ tin cậy trong tập tin chuyên dụng

Các bước trước sẽ dẫn đến việc có chứng chỉ trong một số tệp. Không quan trọng, tập tin đó là gì miễn là nó hiển thị với git của bạn khi truy cập tên miền đó. Tôi đã sử dụng~/git-certs/cert.pem

Lưu ý: Nếu bạn cần chứng chỉ tự gán đáng tin cậy hơn, hãy đặt chúng vào cùng một tệp:

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

Điều này sẽ hoạt động (nhưng tôi đã thử nghiệm nó chỉ với một chứng chỉ).

Cấu hình git để tin tưởng chứng chỉ này

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

Bạn cũng có thể cố gắng làm hệ thống đó rộng, sử dụng --systemthay vì --global.

Và kiểm tra nó: Bây giờ bạn sẽ có thể giao tiếp với máy chủ của mình mà không cần dùng đến:

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

Nếu bạn đã đặt git của mình thành thiếu hiểu biết về chứng chỉ ssl, hãy bỏ đặt nó:

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

và bạn cũng có thể kiểm tra xem bạn đã làm đúng chưa, không có lỗi chính tả:

$ git config --global --list

những gì nên liệt kê tất cả các biến, bạn đã thiết lập trên toàn cầu. (Tôi viết sai http thành ome).


1
Tôi nghĩ rằng câu trả lời này đúng và đầy đủ hơn câu trả lời được chấp nhận. cảm ơn bạn @Jan Vlcinsky
Alfredo Cavalcanti

1
Sau đó, các chứng chỉ có thẩm quyền thông thường ngừng hoạt động, vì vậy tôi không thể lấy ví dụ từ Github. Có cách nào để thêm một chứng chỉ tự ký mà không tắt thẩm quyền đã ký không?
Michael Ivko

4
Giải pháp @MichaelIvko có tính đến 'chứng chỉ có thẩm quyền thông thường' đã được giải thích tại đây (bạn cần thêm chứng chỉ của mình vào tệp 'curl-ca-bundle.crt'): blog.msdn.com/b/phkelley/archive/2014/ 20/01 / ...
Stanislav Berkov

3
Vấn đề với cách tiếp cận này là nó loại bỏ hiệu quả tất cả các CA mặc định đi kèm với git (ví dụ: sau khi thực hiện việc này, bạn sẽ không thể rút khỏi github). Nhiều khả năng đó không phải là những gì hầu hết đang tìm kiếm. Một ví dụ tốt hơn là thêm CA gốc mới vào một bản sao của Git \ bin \ curl-ca-bundle.crt, sau đó tham chiếu bản sao mới của curl-ca-bundle.crt từ gitconfig của bạn.
crimbo

3
Nó không hoạt động trên windows! xuất mọi chứng chỉ trong chuỗi chứng chỉ dưới dạng tệp X.509 được mã hóa Base64 (.CER) Đặt tất cả các tệp lại với nhau và tham chiếu tệp này. Hãy chắc chắn rằng bạn không có khoảng trắng trong đường dẫn đến tệp cert (sử dụng đường dẫn oldschool)
pscheit

3

Điều chỉnh người dùng OSX.

Làm theo các bước của câu trả lời được chấp nhận làm việc với tôi với một bổ sung nhỏ khi định cấu hình trên OSX.

Tôi đặt cert.pemtệp trong một thư mục theo OSX của người dùng đã đăng nhập và do đó khiến tôi phải điều chỉnh vị trí cho chứng chỉ tin cậy.

Cấu hình git để tin tưởng chứng chỉ này:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.