git이 자체 서명 된 인증서를 수락하도록하려면 어떻게해야합니까?


648

Git을 사용하면 자체 서명 된 인증서를 수락하도록 지시 할 수 있습니까?

https 서버를 사용하여 git 서버를 호스팅하고 있지만 현재 인증서는 자체 서명되어 있습니다.

처음으로 레포를 만들려고 할 때 :

git push origin master -f

오류가 발생합니다.

error: Cannot access URL     
https://the server/git.aspx/PocketReferences/, return code 22

fatal: git-http-push failed

4
문제가 인증서라는 것을 어떻게 알 수 있습니까?
Amber

1
대신 PC에서 다른 사용자의 Git 도구를 사용하면 인증서를 무시하고 작동합니다. Mac에서는 무시하는 방법을 알 수 없습니다.
Ian Vink

git 2.1.1과 함께 발생하는 오류 : "치명적 : 'https : //.../project.git/'에 액세스 할 수 없음 : SSL 인증서 문제 : 인증서 체인의 자체 서명 된 인증서"
Stan Kurdziel

OSX / Macintosh에서는 git이 옵션을 사용하지 않는 것 같습니다sslcainfo . curl --cacert리포지토리 경로를 가져 오는 데 성공적으로 사용할 수 있지만 git이 작동하지 않으면 신비한 OSX 키 체인 프로그램에 인증서를 추가해야합니다. 자세한 내용은 여기 superuser.com/questions/605900/…
amwinter

답변:


1168

특정 인증서를 영구적으로 수락하려면

http.sslCAPath또는을 시도하십시오 http.sslCAInfo. Adam Spiers의 답변 은 훌륭한 예입니다. 이것이 질문에 대한 가장 안전한 솔루션입니다.

단일 git 명령에 대해 TLS / SSL 확인을 비활성화하려면

통과 시도 -cgit적절한 설정 변수로, 또는 사용 유량의 답변을 :

git -c http.sslVerify=false clone https://example.com/path/to/git

특정 리포지토리에 대한 SSL 확인을 비활성화하려면

저장소가 완전히 제어 할 수있는 경우 다음을 시도 할 수 있습니다.

git config --global http.sslVerify false

에 몇 가지 SSL 구성 옵션이 git있습니다. 의 맨 페이지에서 git config:

http.sslVerify
    Whether to verify the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_NO_VERIFY environment variable.

http.sslCAInfo
    File containing the certificates to verify the peer with when fetching or pushing
    over HTTPS. Can be overridden by the GIT_SSL_CAINFO environment variable.

http.sslCAPath
    Path containing files with the CA certificates to verify the peer with when
    fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CAPATH environment variable.

몇 가지 다른 유용한 SSL 구성 옵션 :

http.sslCert
    File containing the SSL certificate when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_CERT environment variable.

http.sslKey
    File containing the SSL private key when fetching or pushing over HTTPS.
    Can be overridden by the GIT_SSL_KEY environment variable.

http.sslCertPasswordProtected
    Enable git's password prompt for the SSL certificate. Otherwise OpenSSL will
    prompt the user, possibly many times, if the certificate or private key is encrypted.
    Can be overridden by the GIT_SSL_CERT_PASSWORD_PROTECTED environment variable.

40
'git config --global http.sslVerify false'가 트릭을 수행했습니다. 감사합니다!
Chris Story

110
TLS (/ SSL) 인증서 확인을 전체적으로 비활성화 해서는 안됩니다 .
흐름

4
@Flow-나는 완전히 동의한다. TLS / SSL 인증서 확인을 비활성화하는 것에 대해 더 논쟁 적이되도록이 (현재는 오래된) 답변을 편집했습니다.
Christopher

8
나에게이 git -c http.sslVerify=false clone https://domain.com/path/to/git... 내 문제, 감사를 해결
페르난도 고메스에게

2
@Flow 고용주가 MITM 인 작업 환경에있는 경우 TLS / SSL을 전역 적으로 비활성화하는 대안은 무엇입니까?
Stevoisiak

165

당신은 설정할 수 있습니다 GIT_SSL_NO_VERIFY합니다 true:

GIT_SSL_NO_VERIFY=true git clone https://example.com/path/to/git

또는 명령 줄에서 연결을 확인하지 않도록 Git을 구성하십시오.

git -c http.sslVerify=false clone https://example.com/path/to/git

SSL / TLS 인증서를 확인하지 않으면 MitM 공격에 취약합니다 .


2
-c플래그 on git을 사용하여 단일 명령의 구성 값을 수정할 수도 있습니다 . 그래도이 구문이 더 깨끗하다고 ​​생각합니다.
Christopher

1
아, 나는 -c자식 에 대해 몰랐다 . 실제로 환경을 오염시키는 대신에 더 깨끗한 솔루션이라고 생각합니다. :)
Flow

1
@SkylarSaveland git -c http.sslVerify=false <gitSubCommand>중개인을 통해서도 작동 할 수 있습니다.
Flow

1
이 솔루션을 사용하면 중간자 공격이 가능합니다.
omikron

2
대답 은 가장 안전한 옵션만을 설명 합니다 .
cp.engr

139

보안 검사를 비활성화하는 것이 첫 번째 해결책이 아니라 최후의 수단이어야하므로 기존 답변 의 [편집 : 원본 버전]에 대한 열렬한 팬이 아닙니다. 추가 확인 방법없이 첫 번째 영수증에서 자체 서명 된 인증서를 신뢰할 수는 없지만 후속 git작업에 인증서를 사용하면 인증서를 다운로드 한 후에 만 발생하는 공격의 경우 수명이 훨씬 더 어려워집니다 . 다시 말해, 다운로드 한 인증서 정품이면 그 시점부터 양호합니다. 대조적으로, 단순히 검증을 비활성화하면 어떤 시점 에서든 모든 종류의 중간자 공격 광범위하게 노출됩니다 .

구체적인 예를 들자면 유명한 repo.or.cz저장소는 자체 서명 된 인증서를 제공 합니다 . 해당 파일을 다운로드하여 같은 곳에 배치 /etc/ssl/certs한 다음 수행 할 수 있습니다.

# Initial clone
GIT_SSL_CAINFO=/etc/ssl/certs/rorcz_root_cert.pem \
    git clone https://repo.or.cz/org-mode.git

# Ensure all future interactions with origin remote also work
cd org-mode
git config http.sslCAInfo /etc/ssl/certs/rorcz_root_cert.pem

git config여기서 local을 사용 하지 않으면 (즉, --global)이 자체 서명 인증서는이 특정 리포지토리에 대해서만 신뢰할 수 있다는 것을 의미합니다. 또한 사용하는 것보다 더 좋아 GIT_SSL_CAPATH는 위험 제거하기 때문에 git잠재적으로 손상 될 수있는 다른 인증 기관을 통해 검증을하고 있습니다.


3
우연히도, http.sslCAPath는 libcurl의 ssl_capath 논리를 사용합니다. 실제로 /etc/ssl/certs/디렉토리 에 여러 인증서를 저장할 수 있으며 필요한 모든 것을 효율적으로 정렬 할 수 있다고 생각 합니다. 나는 이것을 테스트하지 않았지만, 당신은 마음에 들지 만, --global많은 인증서와 함께 사용할 수 있습니다 . 그러나 테스트 할 가치가 있습니다.
Christopher

6
SSL 확인을 비활성화 할 위험과 전체적으로 git 자체 서명 된 인증서를 수락하도록하려면 어떻게해야합니까?
PLNech

5
이상적인 세상에는 다음과 같은 것이있을 것입니다.git config http.validCertFingerprint <base64-encoded-hash-of-certifcate>
Flow

1
실제로 시나리오에서 작동하는 인터넷의 유일한 대답입니다. 그것은 개인 Composer VCS 라이브러리이며 SSL을 통해 자체 호스팅 Gitlab에서 호스팅되며 git의 프로젝트 버전에 필요합니다.
Dejv

1
신선한 클론에서; 이것은 한 줄로 수행 할 수 있습니다 : git clone --config http.sslCAInfo=<path_to_cert> https://repo.or.cz/org-mode.git( 'git config'명령을 호출 할 필요가 없습니다).
Aaron

39

힘내 자체 서명 인증서 구성

tl; dr

모든 SSL 확인을 비활성화하지 마십시오!

이것은 나쁜 보안 문화를 만듭니다. 그 사람이되지 마십시오.

당신이 따르는 구성 키는 다음과 같습니다.

  • http.sslverify-항상 그렇습니다. 위의 참고 사항을 참조하십시오.

신뢰할 수있는 호스트 인증서를 구성하기위한 것입니다.

SSL 문제에 응답하도록 인증서를 구성하기위한 것입니다.

위의 설정을 특정 호스트에 선택적으로 적용하십시오.

.gitconfig자체 서명 인증 기관을위한 글로벌

본인과 동료를 위해 여기에 자체 서명 인증서를 비활성화하지 않고 작동시키는 방법이 나와 sslVerify있습니다. 다음.gitconfiggit config --global -e추가 하여편집하십시오 .

# Specify the scheme and host as a 'context' that only these settings apply
# Must use Git v1.8.5+ for these contexts to work
[credential "https://your.domain.com"]
  username = user.name

  # Uncomment the credential helper that applies to your platform
  # Windows
  # helper = manager

  # OSX
  # helper = osxkeychain

  # Linux (in-memory credential helper)
  # helper = cache

  # Linux (permanent storage credential helper)
  # https://askubuntu.com/a/776335/491772

# Specify the scheme and host as a 'context' that only these settings apply 
# Must use Git v1.8.5+ for these contexts to work
[http "https://your.domain.com"]
  ##################################
  # Self Signed Server Certificate #
  ##################################

  # MUST be PEM format
  # Some situations require both the CAPath AND CAInfo 
  sslCAInfo = /path/to/selfCA/self-signed-certificate.crt
  sslCAPath = /path/to/selfCA/
  sslVerify = true

  ###########################################
  # Private Key and Certificate information #
  ###########################################

  # Must be PEM format and include BEGIN CERTIFICATE / END CERTIFICATE, 
  # not just the BEGIN PRIVATE KEY / END PRIVATE KEY for Git to recognise it.
  sslCert = /path/to/privatekey/myprivatecert.pem

  # Even if your PEM file is password protected, set this to false.
  # Setting this to true always asks for a password even if you don't have one.
  # When you do have a password, even with this set to false it will prompt anyhow. 
  sslCertPasswordProtected = 0

참고 문헌 :

git clone-ing 시 설정 지정

리포 단위로 적용해야하는 경우 문서는 git config --localrepo 디렉토리에서 실행하도록 지시합니다 . repo를 로컬로 복제하지 않았을 때 유용하지 않습니다.

global -> local위와 같이 전역 구성을 설정하여 Hokey-pokey를 수행 한 다음 해당 설정이 복제되면 로컬 repo 구성에 복사하십시오 ...

또는 당신이 할 수있는 것은 일단 복제되면 대상 저장소에 적용되는 구성 명령을 지정git clone 하는 것입니다.

# Declare variables to make clone command less verbose     
OUR_CA_PATH=/path/to/selfCA/
OUR_CA_FILE=$OUR_CA_PATH/self-signed-certificate.crt
MY_PEM_FILE=/path/to/privatekey/myprivatecert.pem
SELF_SIGN_CONFIG="-c http.sslCAPath=$OUR_CA_PATH -c http.sslCAInfo=$OUR_CA_FILE -c http.sslVerify=1 -c http.sslCert=$MY_PEM_FILE -c http.sslCertPasswordProtected=0"

# With this environment variable defined it makes subsequent clones easier if you need to pull down multiple repos.
git clone $SELF_SIGN_CONFIG https://mygit.server.com/projects/myproject.git myproject/

짧막 한 농담

편집 : 2.14.x / 2.15 에서이 하나의 라이너까지 특정 자식 버전의 절대 및 상대 경로에 대한 경고를 나타내는 VonC답변 을 참조하십시오

git clone -c http.sslCAPath="/path/to/selfCA" -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" -c http.sslVerify=1 -c http.sslCert="/path/to/privatekey/myprivatecert.pem" -c http.sslCertPasswordProtected=0 https://mygit.server.com/projects/myproject.git myproject/

CentOS unable to load client key

CentOS 에서이 작업을 시도하고 .pem파일에서 제공하는 경우

unable to load client key: "-8178 (SEC_ERROR_BAD_KEY)"

그런 다음 Open SSL 대신 NSS를 사용 하는 방법에 대한 이 StackOverflow 답변 을 원할 curl것입니다.

그리고 당신은 소스 에서 다시 빌드curl 하고 싶습니다 :

git clone http://github.com/curl/curl.git curl/
cd curl/
# Need these for ./buildconf
yum install autoconf automake libtool m4 nroff perl -y
#Need these for ./configure
yum install openssl-devel openldap-devel libssh2-devel -y

./buildconf
su # Switch to super user to install into /usr/bin/curl
./configure --with-openssl --with-ldap --with-libssh2 --prefix=/usr/
make
make install

libcurl이 여전히 공유 라이브러리로 메모리에 있으므로 컴퓨터를 다시 시작하십시오.

파이썬, 핍 및 콘다

관련 : Windows에서 pip가 사용하는 CA Store에 사용자 지정 CA 루트 인증서를 추가하는 방법은 무엇입니까?


Git이 승인하기 전에 자체 서명 서버 인증서가 PEM 형식인지 확인해야했습니다. 또한 위의 답변 중 일부는을 사용하여 인증서 폴더의 경로 만 제공하면된다는 것을 나타냅니다 http.sslCAPath. 필자의 경우 http.sslCAInfo특정 파일을 지정하는 데 사용해야 했습니다. Git이 SSL 유효성 검사를 비활성화하지 않고 개인 GitHub에 연결하도록 허용했습니다.
Zarepheth

@Zarepheth 그 정보에 감사드립니다. CAPath와 CAInfo가 모두 필요한 동일한 문제가 발생했습니다. CA Cert는 PEM 형식이므로 문서화를 간과했습니다. 이 추가 사항으로 답변을 업데이트했습니다. 당신이 안전하게 연결할 수있게되어 기쁩니다.
Josh Peak

HTTPS를 사용하여 복제해야하고 SSH를 사용하여 인증서 엉망을 우회 할 수없는 경우 이는 아마도 가장 좋은 장기 "수정"답변입니다.
dragon788

이 답변을 추가하려고했습니다! 다른 사람이 이미 그것을 알게되어 기쁘다.
Franklin Yu

14

이 문제가 계속 발생하므로 서버에서 자체 서명 인증서를 다운로드하여 ~ / .gitcerts에 설치 한 다음 git-config를 업데이트하여이 인증서를 가리 키도록 스크립트를 작성했습니다. 전역 구성에 저장되므로 원격 당 한 번만 실행하면됩니다.

https://github.com/iwonbigbro/tools/blob/master/bin/git-remote-install-cert.sh


전역 대신 로컬 구성을 사용하는 옵션을 사용하는 것이 더 좋지만 좋습니다.
Adam Spiers

3
당신은 항상 그것을 포크하고 --global 옵션 ;-)을 제거 할 수 있습니다
Craig

이것은 꽤 훌륭합니다. 배치로 제공됩니까?
홀터

10

이 답변은 Michael Kauffman 작성한 이 기사 에서 발췌 한 것입니다 .

회사 SSL 인증서로 Windows 용 Git 사용

이슈 :

회사 SSL 인증서가 있고 콘솔 또는 VSCode에서 저장소를 복제하려는 경우 다음 오류가 발생합니다.

치명적 : ' https : // myserver / tfs / DefaultCollection / _git / Proj / ' 에 액세스 할 수 없음 : SSL 인증서 문제 : 로컬 발급자 인증서를 가져올 수 없습니다

해결책 :

  1. 루트 자체 서명 된 인증서를 파일로 내 보냅니다. 브라우저 내에서이 작업을 수행 할 수 있습니다.

  2. git 폴더에서 "ca-bundle.crt"파일을 찾습니다 (현재 버전 C : \ Program Files \ Git \ usr \ ssl \ certs이지만 과거에 변경되었습니다). 파일을 사용자 프로파일로 복사하십시오. VSCode와 같은 텍스트 편집기로 파일을 열고 내 보낸 인증서의 컨텐츠를 파일 끝에 추가하십시오.

이제 새 파일을 사용하도록 git을 설정해야합니다 :

git config --global http.sslCAInfo C:/Users/<yourname>/ca-bundle.crt

그러면 사용자 프로필 루트의 .gitconfig 파일에 다음 항목이 추가됩니다.

[http] sslCAInfo = C:/Users/<yourname>/ca-bundle.crt


1
감사합니다.이 답변이 Windows에서 더 쉽고 안전하다는 것을 알았습니다.
Pisu

7

특정 리포지토리에 대한 SSL 확인을 비활성화하려면 리포지토리가 완전히 제어 할 수있는 경우 다음을 시도 할 수 있습니다.

 git config --global http.sslVerify false

3

Josh Peak답변 에서처럼 sslKey 또는 sslCert를 사용하여 하나의 라이너를 사용할 때주의하십시오 .

git clone -c http.sslCAPath="/path/to/selfCA" \
  -c http.sslCAInfo="/path/to/selfCA/self-signed-certificate.crt" \
  -c http.sslVerify=1 \
  -c http.sslCert="/path/to/privatekey/myprivatecert.pem" \
  -c http.sslCertPasswordProtected=0 \
https://mygit.server.com/projects/myproject.git myproject

Git 2.14.x / 2.15 (2015 년 3 분기) 만 경로를 ~username/mykey올바르게 해석 할 수 있지만 (와 같이 절대 경로를 해석 할 수는 있음 /path/to/privatekey).

참조 8d15496 커밋 에 의해 (2017년 7월 20일를) Junio C 하마노 ( gitster) .
도움 : Charles Bailey ( hashpling) .
(가 합병 - Junio C 하마노 gitster-17b1e1d 커밋 2017 8월 11일)

http.c: http.sslcert그리고 http.sslkey둘 다 경로 이름입니다

현대의 http_options () 코드 경로가 29508e1에서 다양한 http. * 옵션을 구문 분석하기 위해 만들어 졌을 때 ( "공유 HTTP 요청 기능 격리", 2005-11-18, Git 0.99.9k) 나중에 여러 항목 사이의 상호 작용을 위해 수정되었습니다. 의 구성 파일 7059cd9 ( " http_init(): 수정 설정 파일 구문 분석", 2009-03-09는, 힘내 1.6.3-RC0)를, 우리가 같이 구성 변수를 구문 분석 http.sslkey, http.sslcert때문에, 일반 바닐라 문자열로 git_config_pathname()그 "이해 ~[username]/접두사는 존재하지 않았다."

나중에, 우리는 그들 중 일부 변환 (즉를 http.sslCAPath하고 http.sslCAInfo) 기능을 사용하고, 추가 변수처럼 http.cookeyFile http.pinnedpubkey처음부터 기능을 사용 할 수 있습니다. 따라서이 변수는 모두 " ~[username]/"접두사를 이해 합니다.

나머지 두 변수를 확인, http.sslcert그리고 http.sslkey그들은 모두 명확하게 파일 경로 이름 그대로, 또한, 협약 알고 있습니다.


3

Windows에서 64 비트 버전의 Git을 사용하여 자체 서명 된 CA 인증서를 다음 파일에 추가하십시오.

  • C : \ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.crt
  • C : \ Program Files \ Git \ mingw64 \ ssl \ certs \ ca-bundle.trust.crt

서버 자체 서명 인증서 인 경우 다음에 추가하십시오.

  • C : \ 프로그램 파일 \ Git \ mingw64 \ ssl \ cert.pem

이것이 모든 HTTPS 트래픽을 다시 서명하는 회사 방화벽을 처리하는 가장 좋은 방법이었습니다. 방금 방화벽 인증서의 PEM 형식의 crt 파일을 텍스트로 가져 와서 복사하여 ca 번들에 붙여 넣고 매력처럼 작동합니다.
Mitten.O

3

바이러스 백신 및 방화벽 설정을 확인하십시오.

일일부터 다른, 자식이 더 이상 작동하지 않았다. 위에서 설명한 내용으로 카스퍼 스키가 자체 서명 된 안티 바이러스 개인 루트 인증서를 중간에 넣는 것을 발견했습니다. 위의 지침에 따라 Git이 해당 인증서를 수락하도록 허용하지 않았습니다. 나는 포기했다. 나를 위해 일하는 것은 암호화 된 연결을 스캔하는 기능을 비활성화하는 것입니다.

  1. 카스퍼 스키 열기
  2. 설정> 추가> 네트워크> 암호화 된 연결 검색 안 함

이 후 git은 sslVerify를 사용하여 다시 작동합니다.

노트. 안티 바이러스의 기능을 활성화하고 싶기 때문에 여전히 만족스럽지 않습니다. 고급 설정에서 Kaspersky는 해당 기능과 작동하지 않는 웹 사이트 목록을 보여줍니다. Github는 그중 하나가 아닙니다. 카스퍼 스키 포럼에서 확인하겠습니다. https://forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211 와 같은 주제가있는 것 같습니다.



1

나는 이렇게한다 :

git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git

3
사용하지 마십시오 --global! 많은 튜토리얼이 보여 --global주지만 일반적 http.sslVerify으로 특히 나쁜 생각입니다 . 컴퓨터에 다른 프로젝트, 회사, 팀의 복제본이 하나 이상 있으면 문제가 발생할 수 있습니다. 예를 들어, 한 프로젝트에서 다음 프로젝트로 누출되는 사용자 ID와 이메일은 상당히 당황 스러울 수 있습니다. 그리고 사용 --global에 대한 것은 http.sslVerify모든 종류의 보안 문제에 당신을 열 수 있습니다. 따라서 --global부작용을 완전히 알고 위험을 감수 할 준비가되어 있지 않으면 사용하지 마십시오 .
마틴

1

Windows에서이 나를 위해 일한 :

자체 서명 된 인증서의 내용을 ca 번들 파일 의 끝에 추가 하십시오. (가) 포함 ----- 인증서를 BEGIN ---------- END의 CERTIFICATE ----- 라인

ca 번들 파일 의 위치 는 일반적으로 C : \ Program Files \ Git \ mingw64 \ ssl \ certs입니다.

그런 다음 ca 번들 파일 의 경로를 전역 git 구성에 추가하십시오. 다음 명령은 트릭을 수행합니다.git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

비고 : 경로는 ca 번들 파일의 로컬 경로에 따라 다릅니다.


1

http.sslVerify를 false로 설정하는 것은 좋지 않습니다. 대신 SSL 인증서를 사용할 수 있습니다.

따라서 빌드 에이전트는 인증을 위해 SSL 인증서 및 PAT와 함께 https를 사용합니다. 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

–begin- 및 –end--를 포함하여 cer 파일의 내용을 복사하십시오.

빌드 에이전트의 git bash => git config –global http.sslcainfo“C : / Program Files / Git / mingw64 / ssl / certs / ca-bundle.crt”이 파일로 이동하여 .cer 컨텐츠를 추가하십시오.

따라서 빌드 에이전트는 SSL 인증서에 액세스 할 수 있습니다


0

답변이 늦었을 수도 있지만 효과가있었습니다. 누군가를 도울 수 있습니다.

위에서 언급 한 단계를 시도했지만 문제가 해결되지 않았습니다.

이 시도git config --global http.sslVerify false


0

Windows 컴퓨터를 사용 하는데이 기사가 도움 되었습니다. 기본적으로 메모장에서 ca-bundle.crt를 열고 체인 인증서를 추가했습니다 (모두). 이 문제는 보통 시스템과 git repo 사이에 중간 남자가있는 회사 네트워크에서 발생합니다. 기본 64 형식의 리프 인증서를 제외한 인증서 체인의 모든 인증서를 내보내고 ca-bundle.crt에 모든 인증서를 추가 한 다음이 수정 된 crt 파일에 대해 git을 구성해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.