특정 https 원격에 대한 특정 자체 서명 서버 인증서를 수락하도록 Git 구성


167

내가 사용중인 프로젝트의 sysadmin은 SSH가 "너무 많은 문제"라고 결정했습니다. 대신 https://URL (및 사용자 이름 / 암호 인증)을 통해 Git에 액세스 할 수 있도록 설정했습니다 . 이 URL의 서버는 자체 서명 된 인증서를 제공하므로 모든 사람이 인증서 유효성 검사를 해제하도록 권고했습니다. 이것은 보안 측면에서 좋은 설정이라고 생각하지 않습니다.

Git에 원격 X (또는 더 나은 저장소로 시작하는 원격 https://$SERVERNAME/)의 경우 특정 인증서를 수락하고 해당 인증서 수락 한다고 Git에 알릴 수 있습니까? 기본적으로 SSH의 서버 키 동작을 복제합니다.


유닉스에서 C Git에 대해 질문하고 있습니다.
Piotr Findeisen

야아. 글쎄, 아마도 Windows도 가능하지만 지금은 아무도 그렇게하지 않습니다.
zwol

5
WTF? @Zack 당신은 인증서 확인에 대한 절대 권리입니다. 관리자가 인증서 검사를 꺼야한다고 말하면 서버에서 TLS를 끌 수도 있습니다. 모든 사람이 중간자 공격에 대한 보호 기능을 비활성화하고 있기 때문입니다.
Rudi

@Rudi, IP 주소를 사용하여 서버에 액세스하는 경우에도 여전히 그렇습니까? (DNS 조회는 MITM이 어떻게 사용되는지에 따라 IP 주소가 이에 영향을받지 않는 것 같습니다.)
Chris

6
@Chris 예, 여전히 그렇습니다. MITM 라우터는 원하는 IP 주소 인 것처럼 가장 할 수 있습니다. (공항에서 무료 Wi-Fi를 사용하는 삽입 광고 페이지를 알고 있습니까? MITM입니다. 언젠가 IP 주소로 페이지에 액세스 해보십시오.)
zwol

답변:


295

간단히:

  1. 자체 서명 된 인증서 받기
  2. 그것을 (예를 들어 ~/git-certs/cert.pem) 파일에 넣으십시오
  3. 매개 변수를 git사용하여이 인증서를 신뢰하도록 설정http.sslCAInfo

자세한 내용은 :

원격 서버의 자체 서명 된 인증서 받기

서버 URL이 repos.sample.com있고 port를 통해 액세스하려고 한다고 가정하십시오 443.

얻는 방법에는 여러 가지 옵션이 있습니다.

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

웹 브라우저를 사용하여 인증서 받기

Git 리포지토리와 함께 Redmine을 사용하고 웹 UI 및 git 명령 줄 액세스를 위해 동일한 URL에 액세스합니다. 이렇게하면 해당 도메인에 대한 예외를 웹 브라우저에 추가해야했습니다.

Firefox를 사용하여에 가서 자체 Options -> Advanced -> Certificates -> View Certificates -> Servers서명 된 호스트를 발견하고 그것을 선택했으며 Export버튼을 사용하여을 사용하여 만든 것과 정확히 동일한 파일을 얻었습니다 openssl.

참고 : 나는 조금 놀랐습니다. 눈에 띄게 언급 된 권위의 이름은 없습니다. 이건 괜찮아.

전용 파일에 신뢰할 수있는 인증서 보유

이전 단계에서는 일부 파일에 인증서가 있어야합니다. 해당 도메인에 액세스 할 때 자식이 볼 수있는 한 파일은 중요하지 않습니다. 나는 사용했다~/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

git을 ssl 인증서를 무시하도록 이미 설정 한 경우 설정을 해제하십시오.

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

또한 철자 오류없이 올바르게 수행했는지 확인할 수도 있습니다.

$ git config --global --list

모든 변수를 나열해야 할 것은 전체적으로 설정 한 것입니다. (http를 htt로 잘못 입력했습니다).


1
나는이 대답이 허용 된 것보다 정확하고 완전하다고 생각합니다. 당신에게 @Jan Vlcinsky 감사합니다
알프레도 카 발칸 티

1
그 후 일반적인 기관 서명 인증서가 작동을 멈추므로 Github에서 뽑을 수 없습니다. 기관에서 서명 한 인증서를 끄지 않고 자체 서명 된 인증서를 추가하는 방법이 있습니까?
Michael Ivko

4
여기에 설명 된 '일반적인 권한 서명 된 인증서'를 고려한 @MichaelIvko 솔루션 ( 'curl-ca-bundle.crt'파일에 인증서를 추가해야 함) : blogs.msdn.com/b/phkelley/archive/2014/ 01 / 20 /…
Stanislav Berkov

3
이 접근 방식의 문제점은 git과 함께 제공되는 모든 기본 CA를 효과적으로 제거한다는 것입니다 (예 : 이렇게하면 github에서 가져올 수 없음). 아마도 그것은 대부분이 찾고있는 것이 아닙니다. 더 좋은 예는 새 루트 CA를 Git \ bin \ curl-ca-bundle.crt 복사본에 추가 한 다음 gitconfig에서 curl-ca-bundle.crt의 새 복사본을 참조하는 것입니다.
crimbo

3
그것은 창문에서 작동합니다! 인증서 체인의 모든 인증서를 Base64 코드 X.509 파일 (.CER)로 내보내기 모든 파일을 모아서이 파일을 참조하십시오. cert 파일 경로에 공백이
없어야

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.