Como posso fazer o git aceitar um certificado autoassinado?

Usando o Git, existe uma maneira de dizer para aceitar um certificado autoassinado?

Estou usando um servidor https para hospedar um servidor git, mas por enquanto o certificado é auto-assinado.

Quando tento criar o repository pela primeira vez:

git push origin master -f 

Eu recebo o erro:

 error: Cannot access URL https://the server/git.aspx/PocketReferences/, return code 22 fatal: git-http-push failed 

Para aceitar permanentemente um certificado específico

Tente http.sslCAPath ou http.sslCAInfo . A resposta de Adam Spiers dá alguns ótimos exemplos. Esta é a solução mais segura para a questão.

Para desativar a verificação TLS / SSL para um único comando git

tente passar -c para git com a variável de configuração apropriada ou use a resposta do Flow :

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

Para desativar a verificação de SSL para um repository específico

Se o repository estiver completamente sob seu controle, você pode tentar:

 git config http.sslVerify false 

Desabilitar globalmente a verificação de certificados TLS (/ SSL) é uma prática terrivelmente insegura. Não faça isso. Não emita o comando acima com um modificador --global .


Existem algumas opções de configuração SSL no git . Na página man do 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. 

Algumas outras opções úteis de configuração 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. 

Você pode definir GIT_SSL_NO_VERIFY como true :

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

ou alternativamente configure o Git para não verificar a conexão na linha de comando:

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

Observe que, se você não verificar os certificados SSL / TLS, estará suscetível a ataques MitM .

Eu não sou um grande fã das [EDIT: versões originais das] respostas existentes, porque desabilitar as verificações de segurança deve ser um último recurso, não a primeira solução oferecida. Mesmo que você não possa confiar em certificados autoassinados no primeiro recebimento sem algum método adicional de verificação, usar o certificado para operações subsequentes do git pelo menos dificulta muito a vida de ataques que só ocorrem após o download do certificado. Em outras palavras, se o certificado que você baixou é genuíno, então você é bom a partir desse momento. Por outro lado, se você simplesmente desabilitar a verificação, estará aberto a qualquer tipo de ataque man-in-the-middle a qualquer momento .

Para dar um exemplo específico: o famoso repository repo.or.cz fornece um certificado autoassinado . Eu posso baixar esse arquivo, colocá-lo em algum lugar como /etc/ssl/certs e então fazer:

 # 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 

Note que usar a git config local do git config aqui (ou seja, sem --global ) significa que este certificado auto-assinado é confiável apenas para este repository em particular, o que é legal. Também é melhor do que usar o GIT_SSL_CAPATH pois elimina o risco de o git fazer a verificação por meio de uma Autoridade de Certificação diferente, que poderia estar comprometida.

Global .gitconfig para Autoridades de Certificação Auto-Assinadas

Para o meu próprio e o de meus colegas, aqui está como conseguimos obter certificados auto-assinados para funcionar sem desabilitar o sslVerify . Edite seu .gitconfig para usar git config --global -e adicione estes:

 # 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 

Referências:

  • Credenciais do Git
  • Loja de credenciais do Git
  • Usando o Gnome Keyring como armazenamento de credenciais
  • Git Config http. . * Suportado pelo Git v1.8.5

Especifique config quando git clone -ing

Se você precisar aplicá-lo em uma base por repo, a documentação diz para você executar apenas git config --local no seu diretório repo. Bem, isso não é útil quando você não tem o repo clonado localmente, mas agora é?

Você pode fazer o global -> local hokey-pokey, definindo sua configuração global como acima e, em seguida, copie essas configurações para o seu local repo config, uma vez que clona …

OU o que você pode fazer é especificar comandos de configuração no git clone que são aplicados ao repository de destino depois que ele é clonado.

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

Um forro

EDIT: Veja resposta do VonC que aponta uma ressalva sobre caminhos absolutos e relativos para versões de git específicas de 2.14.x / 2.15 para este forro

 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

Se você está tentando isso no CentOS e seu arquivo .pem está dando a você

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

Em seguida, você desejará essa resposta do StackOverflow sobre como o curl usa o NSS em vez do Open SSL.

E você gostaria de querer reconstruir a curl partir da fonte :

 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 

reiniciar o computador, pois o libcurl ainda está na memory como uma biblioteca compartilhada

Eu continuo encontrando este problema, então escrevi um script para baixar o certificado autoassinado do servidor e instalá-lo em ~ / .gitcerts, depois atualizar git-config para apontar para estes certificados. Ele é armazenado na configuração global, portanto, você só precisa executá-lo uma vez por controle remoto.

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

Tenha cuidado quando estiver usando um liner usando sslKey ou sslCert, como na resposta de Josh Peak :

 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 

Apenas o Git 2.14.x / 2.15 (Q3 2015) seria capaz de interpretar um caminho como ~username/mykey corretamente (embora ainda possa interpretar um caminho absoluto como /path/to/privatekey ).

Veja commit 8d15496 (20 jul 2017) de Junio ​​C Hamano ( gitster ) .
Ajudado por: Charles Bailey ( hashpling ) .
(Mergulhado por Junio ​​C Hamano – gitster – em commit 17b1e1d , 11 ago 2017)

http.c : http.sslcert e http.sslkey são ambos os caminhos

Voltar quando o moderno caminho de código http_options () foi criado para analisar várias opções http. * Em 29508e1 (“Isolar a funcionalidade de solicitação HTTP compartilhada”, 2005-11-18, Git 0.99.9k) e, posteriormente, foi corrigido para interação entre as várias arquivos de configuração em 7059cd9 (” http_init() : Corrigir análise de arquivo de configuração”, 2009-03-09, Git 1.6.3-rc0), analisamos variables ​​de configuração como http.sslkey , http.sslcert como strings de baunilha simples, porque git_config_pathname() que entende que o prefixo ” ~[username]/ ” não existe.

Posteriormente, convertemos alguns deles (ou seja, http.sslCAPath e http.sslCAInfo ) para usar a function e adicionamos variables ​​como http.cookeyFile http.pinnedpubkey para usar a function desde o início. Por causa disso, todas essas variables ​​entendem o prefixo ” ~[username]/ “.

Faça as duas variables ​​restantes, http.sslcert e http.sslkey , também ciente da convenção, já que ambas são claramente caminhos para arquivos.

Esta resposta foi extraída deste artigo de autoria de Michael Kauffman.

Use o Git for Windows com um certificado SSL corporativo

Questão :

Se você possui um certificado SSL corporativo e deseja clonar seu repository no console ou no VSCode, você recebe o seguinte erro:

fatal: não é possível acessar ‘ https: // myserver / tfs / DefaultCollection / _git / Proj / ‘: problema de certificado SSL: não é possível obter certificado de emissor local

Solução :

  1. Exporte o certificado autoassinado raiz para um arquivo. Você pode fazer isso de dentro do seu navegador.

  2. Localize o arquivo “ca-bundle.crt” na sua pasta git (a versão atual C: \ Arquivos de Programas \ Git \ usr \ ssl \ certs, mas foi alterada no passado). Copie o arquivo para o seu perfil de usuário. Abra-o com um editor de texto como o VSCode e adicione o conteúdo do seu certificado exportado ao final do arquivo.

Agora temos que configurar o git para usar o novo arquivo:

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

Isso adicionará a seguinte input ao seu arquivo .gitconfig na raiz do seu perfil de usuário.

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

Verifique suas configurações de antivírus e firewall.

De um dia para o outro, o git não funcionava mais. Com o descrito acima, descobri que o Kaspersky coloca um certificado raiz pessoal do Antivírus auto-assinado no meio. Eu não consegui deixar o Git aceitar esse certificado seguindo as instruções acima. Eu desisti disso. O que funciona para mim é desabilitar o recurso para escanear conexões criptografadas.

  1. Abra o Kaspersky
  2. Configurações> Adicionais> Rede> Não verificar conexões criptografadas

Depois disso, o git funciona novamente com o sslVerify ativado.

Nota. Isso ainda não é satisfatório para mim, porque gostaria de ter esse recurso do meu antivírus ativo. Nas configurações avançadas, o Kaspersky mostra uma lista de sites que não funcionam com esse recurso. O Github não está listado como um deles. Vou verificar isso no fórum da Kaspersky. Parece haver alguns tópicos, por exemplo, https://forum.kaspersky.com/index.php?/topic/395220-kis-interference-with-git/&tab=comments#comment-2801211

No arquivo .gitconfig, você pode adicionar o valor abaixo indicado para tornar o certificado auto-assinado aceitável

sslCAInfo = /home/XXXX/abc.crt

Usando a versão de 64 bits do Git no Windows, basta adicionar o certificado de CA auto-assinado nesses arquivos:

  • C: \ Arquivos de programas \ Git \ mingw64 \ ssl \ certs \ ca-bundle.crt
  • C: \ Arquivos de programas \ Git \ mingw64 \ ssl \ certs \ ca-bundle.trust.crt

Se for apenas um certificado auto-assinado do servidor, adicione-o

  • C: \ Arquivos de Programas \ Git \ mingw64 \ ssl \ cert.pem

Execute o seguinte comando:

 git config --global http.sslVerify false