Não foi possível resolver "não é possível obter o certificado do emissor local" usando o git no Windows com certificado autoassinado


283

Estou usando o Git no Windows. Eu instalei o pacote msysGit. Meu repositório de teste possui um certificado autoassinado no servidor. Eu posso acessar e usar o repositório usando HTTP sem problemas. Mover para HTTPS fornece o erro:

Problema no certificado SSL: não é possível obter o certificado do emissor local.

Eu tenho o certificado autoassinado instalado nas Autoridades de Certificação Raiz Confiáveis ​​da minha máquina cliente com Windows 7. Posso navegar até a URL do repositório HTTPS no Internet Explorer sem mensagens de erro.

Esta postagem no blog de Philip Kelley explicou que o cURL não usa o armazenamento de certificados da máquina cliente. Segui o conselho da postagem no blog para criar uma cópia privada curl-ca-bundle.crte configurar o Git para usá-lo. Tenho certeza que o Git está usando minha cópia. Se eu renomear a cópia; O Git reclama que o arquivo está faltando.

Colei no meu certificado, conforme mencionado na postagem do blog, ainda recebo a mensagem "Impossível obter o certificado do emissor local".

Eu verifiquei que o Git ainda estava funcionando clonando um repositório do GitHub via HTTPS.

A única coisa que vejo diferente da postagem do blog é que meu certificado é a raiz - não há corrente para alcançá-lo. Meu certificado veio originalmente de clicar no link IIS8 IIS Manager 'Criar certificado autoassinado'. Talvez isso faça com que um certificado seja diferente de alguma forma do que o cURL espera.

Como faço para o Git / cURL aceitar o certificado autoassinado?



1
Verifique também se a sua rede local tem permissão para enviar arquivos para o repositório do github. Pode haver alguma restrição de firewall ou antivírus.
— Shasi kanth

Se alguém enfrentar esse erro ao usar o Bower, crie um arquivo .bowerrc com o conteúdo { "strict-ssl": false }. Não me agradeça, agradeça a esse cara: stapp.space/fight-with-2 Eu lutei com esse erro por quase 5 horas, direto !!
— Ganesh Jadhav

Respostas:


267

Abra o Git Bash e execute o comando se desejar desativar completamente a verificação SSL.

git config --global http.sslVerify false

Nota: Esta solução pode abrir você para ataques como ataques man-in-the-middle . Portanto, ative a verificação novamente o mais rápido possível:

git config --global http.sslVerify true

70
Esta resposta derrota a segurança do SSL, permitindo ataques do tipo man-in-the-middle. Outras respostas já explicam como configurar o git para confiar no certificado específico necessário.
— Dsh

12
Na verdade, uma resposta horrível, você nem pede para ativar o SSL novamente. É por isso que as vulnerabilidades de segurança acontecem.
— Edgar Aroutiounian 02/02

Se você estiver usando o Gitblit, não haverá outra opção em vez de fazer o sshVerify false.
— Samir

24
Para desabilitar a verificação TLS / SSL para um único comando git, use o seguinte comando:git -c http.sslVerify=false clone https://domain.com/path/to/git
— Maxim Suslov

1
Existem várias soluções já fornecidas abaixo, e eu já sugeri os contras. Portanto, depende de você que soluções você está escolhendo para resolver o problema.
— Samir

154

O problema é que o git, por padrão, usa o back-end de criptografia "Linux".

A partir do Git para Windows 2.14, agora você pode configurar o Git para usar o SChannel, a camada de rede interna do Windows como o back-end de criptografia. Isso significa que você usará o mecanismo de armazenamento de certificados do Windows e não precisará configurar explicitamente o mecanismo de armazenamento da CA de ondulação: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123(v= vs.85) .aspx

Basta executar:

git config --global http.sslbackend schannel

Isso deve ajudar.

O uso do schannel agora é a configuração padrão ao instalar o git para Windows, também é recomendável não efetuar o check-out dos repositórios pelo SSH, se possível, pois o https é mais fácil de configurar e menos provável de ser bloqueado por um firewall, significa menos chances de falha.


1
Observe, no entanto, que esta solução pode git config --global http.sslCAInfo <my-server-self-signed-cert.pem>deixar de funcionar. Configurei http.sslCAInfopara usar um certificado autoassinado para o meu servidor, e é o motivo (pode não ser o mesmo que OP) que encontrei "Problema no certificado SSL: não é possível obter o certificado do emissor local" quando, por exemplo, a git clone https://github.com/Microsoft/vscode.git. Finalmente, usei a resposta de stackoverflow.com/a/47196562/1323552 (Ben PP Tung) para ajustar minha configuração sslCAInfo específica do meu servidor git para resolvê-lo.
— Johnny Wong

94

Eu tive esse problema também. No meu caso, eu estava tentando obter um gancho Git pós-recebimento para atualizar uma cópia de trabalho em um servidor a cada push. Tentei seguir as instruções no blog ao qual você vinculou. Também não funcionou para mim e substituir as configurações por usuário também não pareceu funcionar.

O que acabei fazendo foi desabilitar a verificação SSL (como o artigo menciona) para o Git como um todo. Não é a solução perfeita, mas funcionará até que eu possa descobrir uma melhor.

Editei o arquivo de texto de configuração do Git (com meu aplicativo neutro de final de linha favorito como o Notepad ++) localizado em:

C: \ Arquivos de programas (x86) \ Git \ etc \ gitconfig

No bloco [http], adicionei uma opção para desativar o sslVerify. Ficou assim quando eu terminei:

[http]
    sslVerify = false
    sslCAinfo = /bin/curl-ca-bundle.crt

Isso fez o truque.

NOTA:

  • Isso desativa a verificação SSL e não é recomendada como uma solução de longo prazo.

  • Você pode desativar esse repositório por repositório, o que ainda não é ótimo, mas localiza a configuração.

  • Com o advento do LetsEncrypt.org, agora é bastante simples, automatizado e gratuito configurar o SSL como uma alternativa aos certificados autoassinados e nega a necessidade de desativar o sslVerify.


145
Isso anula o objetivo do SSL.
— syaz 8/09/14

49
você pode usar o comando "git config --global http.sslVerify false" para desativar a verificação SSL
— CleanCoder

6
Obrigado por apontar a sslCAinfoentrada de configuração; mas não estou votando positivamente na resposta, pois não faz muito sentido desabilitar permanentemente o SSL para o git em todo o sistema (você tentou desabilitá-lo em todo o sistema, cloná-lo, reativá-lo e desabilitá-lo no diretório configuração git local para o repositório recém-clonado?).
— 7heo.tk 30/03

35
Para um comando único, não há necessidade de alterar os arquivos de configuração:git -c http.sslVerify=false clone https://...
— pts


51

kiddailey Eu acho que estava bem próximo, no entanto, eu não desativaria a verificação ssl, mas apenas forneceria o certificado local:

No arquivo de configuração do Git

[http]
    sslCAinfo = /bin/curl-ca-bundle.crt

Ou via linha de comando:

git config --global http.sslCAinfo /bin/curl-ca-bundle.crt

7
No git para windows, isso é #git config --global http.sslCAinfo /usr/ssl/certs/ca-bundle.crt
— Karsten Tinnefeld 29/09

Ou para mimgit config --global http.sslCAinfo /c/Program\ Files\ \(x86\)/Git/bin/curl-ca-bundle.crt
— sparrowt 24/11/16

Para os usuários do MacPorts, isto égit config --global http.sslCAinfo /opt/local/share/curl/curl-ca-bundle.crt
— miken32

3
Com o Git 2.8, você pode usar git config --list --show-originpara ver onde a configuração do http.sslCAinfo está definida.
— Anish

O local do meu certificado no mac é: ~ / macports / share / curl / curl-ca-bundle.crt
— #

47

Eu também enfrentei esse problema. E, finalmente, foi resolvido com a orientação deste blog do MSDN .

Atualizar

Na verdade, você precisa adicionar o certificado no arquivo de certificados do git curl-ca-bundel.cert que reside no diretório Git \ bin.

Passos

  1. Abra sua página do github no navegador e clique no ícone de cadeado na barra de endereços.
  2. No pequeno pop-up aberto, navegue até o link 'ver certificado', ele abrirá uma janela pop-up.
  3. Na qual navegue até a guia Certificados (3º no meu caso). Selecione o nó superior que é o certificado raiz. E pressione o botão copiar certificado na parte inferior e salve o arquivo.
  4. No explorador de arquivos, navegue no diretório Git \ bin e abra curl-ca-bundle.crt no editor de texto.
  5. Abra o arquivo de certificado exportado (na etapa 3) também no editor de texto.
  6. Copie todo o conteúdo do certificado exportado para o final de curl-ca-bundle.crt e salve.

Por fim, verifique o status. Observe que o arquivo curl-ca-bundle.crt de backup antes de editar permanece no lado seguro.


3
"navegue no diretório Git \ bin e abra curl-ca-bundle.crt" Não há curl-ca-bundle.crt no git \ bin!
— Anton K

@AntonK, se não existir, crie um no bloco de notas e renomeie-o com curl-ca-bundle.crt. Outras etapas permanecem iguais.
— Nadeem Jamali

16
@AntonK Pode ser chamado just ca-bundle.crte estar localizado em mingw64\ssl\certsou mingw32\ssl\certs.
— Ian Kemp

Utilizado para o SourceTree da Atlassian. A instalação do GIT em pacote configurável está em% userprofile% \ appdata \ local \ attlassian \ sourcetree \ git_local. o curl-ca-bundle.crt já existia, anexava meu certificado raiz exportado codificado em base64.
— Xanothos

40

A resposta para esta pergunta O uso do makecert for Development SSL corrigiu isso para mim.

Não sei por que, mas o certificado criado pelo simples link 'Criar certificado autoassinado' no Gerenciador do IIS não funciona. Eu segui a abordagem na questão vinculada de criação e instalação de um CA Root autoassinado; usando-o para emitir um certificado de autenticação de servidor para o meu servidor. Eu instalei os dois no IIS.

Isso deixa minha situação igual à postagem de blog mencionada na pergunta original. Depois que o certificado raiz foi copiado / colado no curl-ca-bundle.crt, a combinação git / curl foi satisfeita.


"Não sei por que, mas o certificado criado pelo link simples 'Criar certificado autoassinado' no Gerenciador do IIS não funciona" - O melhor que posso dizer é que ele cria certificados malformados. Existem muitas regras ao criar certificados X.509; o "faça o mínimo para fazê-lo funcionar" não funciona mais bem. Consulte também Como você assina a Solicitação de assinatura de certificado com sua autoridade de certificação e Como criar um certificado autoassinado com o openssl?
— JWW

Isso funcionou para mim, mas fiquei temporariamente desligado na parte "Instalei os dois no IIS". Para impressionar os outros ... o certificado do servidor é atribuído no IIS e a CA raiz precisa ser importada para "Autoridades de Certificação Raiz Confiáveis" através do utilitário gerenciador de certificação do Windows (certmgr.msc)
— Philip

26

Para evitar desabilitar a verificação ssl completamente ou duplicar / invadir o arquivo de certificado CA empacotado usado pelo git, você pode exportar a cadeia de certificados do host para um arquivo e fazer com que o git a use:

git config --global http.https://the.host.com/.sslCAInfo c:/users/me/the.host.com.cer

Se isso não funcionar, você pode desativar a verificação SSL apenas para o host:

git config --global http.https://the.host.com/.sslVerify false

Nota: Submetido a possíveis ataques man in the middle quando a verificação ssl está desativada.


4
Pode ser interessante notar que a --globalopção não é necessária: se você omitir --global, a configuração se aplica apenas a esse repositório git específico.
— Wes Turner

19

Acabei de ter o mesmo problema, mas usando o sourcetree no Windows As mesmas etapas para o GIT normal no Windows também. Seguindo as etapas a seguir, consegui resolver esse problema.

  1. Obter a árvore de certificados do servidor Isso pode ser feito usando o chrome. Navegue até o endereço do servidor. Clique no ícone do cadeado e veja os certificados. Exporte toda a cadeia de certificados no formato de arquivos codificados em base64 (PEM).
  2. Adicione os certificados à cadeia confiável do seu arquivo de configuração confiável do GIT Execute "git config --list". encontre a configuração "http.sslcainfo" que mostra onde o arquivo confiável de certificado está localizado. Copie todos os certificados no arquivo de cadeia confiável, incluindo "- -BEGIN- -" e "- -END- -".
  3. Certifique-se de adicionar toda a cadeia de certificados ao arquivo de certificados

Isso deve resolver seu problema com os certificados autoassinados e usando o GIT.

Tentei usar a configuração "http.sslcapath", mas isso não funcionou. Além disso, se eu não incluísse toda a cadeia no arquivo de certificados, isso também falharia. Se alguém tiver dicas sobre isso, entre em contato, pois o procedimento acima deve ser repetido para uma nova instalação.

Se este for o GIT do sistema, você poderá usar as opções na guia FERRAMENTAS -> Opções GIt para usar o GIT do sistema e isso resolverá o problema no código fonte também.


2
"se eu não incluísse toda a cadeia no arquivo de certificados, isso também falharia" - acabei de encontrar este problema
— Amani Kilumanga 15/16/16

No que diz respeito à inclusão de toda a cadeia, tenho duas certs acima do certificado do github. Eu os incluo em ordem como root-> next cert-> github cert no arquivo sslcainfo.crt?
— Jecoms

Consegui acessar pacotes de repositórios git apenas adicionando o certificado raiz.
— JCOMS6

Para futuros leitores. Não faço ideia se isso importa, mas coloquei o certificado "root" (mais alto) no final do arquivo (http.sslcainfo). E então, quando me afastei do certificado raiz na cadeia, coloquei esse certificado acima da entrada anterior do arquivo (http.sslcainfo).
— granadaCoder

11

No caso dos Repositórios do github (ou qualquer documento não autoassinado) , a escolha abaixo ao instalar o Git-on-windows, resolveu o problema.

insira a descrição da imagem aqui


1
Você parecia ter respondido a uma pergunta diferente. A pergunta do OP dizia respeito a certificados autoassinados em clientes Windows.
— JWW

@jww o título da pergunta é uma mensagem de erro do git exibida mesmo que o repo NÃO seja SSL autoassinado!
— Jawad Al Shaikh

Isso me levou a passar o erro, mas, para acessar o GitHub Enterprise, era necessária alguma geração de chave e adição de chaves públicas / privadas.
— EgamegaMan

1
Se o certificado autoassinado foi colocado no armazenamento de certificados do Windows por um administrador útil do Windows por meio de uma diretiva de grupo, essa resposta também é boa.
— JamesD

7

Eu já tive esse problema antes e resolva-o usando a seguinte configuração.

[http "https://your.domain"] sslCAInfo=/path/to/your/domain/priviate-certificate

Desde o git 2.3.1, você pode colocar https://your.domainapós http para indicar que o certificado a seguir é apenas para ele.


1
Esta é a solução simpliest e mais precisa que eu encontrei, se você também configurado git config --global http.sslCAInfo <your-server-self-signed-cert.pem>antes (portanto, causando o "incapaz de obter certificado do emissor local" erro)
— Johnny Wong

ESTA foi a resposta correta para o meu problema (e não simplesmente "desativando a validação SSL" ~~). Não sabia que você pode especificar a localização do certificado apenas para um host específico. Ás!
— Rocío García Luque

1
  1. Faça o download do certificado neste link: https://github.com/bagder/ca-bundle
  2. Adicione C:\Program Files\Git\bin eC:\Program Files\Git\mingw64\bin

Em seguida, tente algo como: git clone https://github.com/heroku/node-js-getting-started.git


1

Uma coisa que me atrapalhou foi o formato do caminho (no meu PC com Windows). Eu originalmente tinha isso:

git config --global http.sslCAInfo C:\certs\cacert.pem

Mas isso falhou com o erro "não é possível obter o certificado do emissor local".

O que finalmente funcionou foi o seguinte:

git config --global http.sslCAInfo "C:\\certs\\cacert.pem"

1

No meu caso, como eu instalei o ConEmu Terminal para Windows 7, ele cria o ca-bundledurante a instalação em C:\Program Files\Git\mingw64\ssl\certs.

Portanto, eu tenho que executar os seguintes comandos no terminal para fazê-lo funcionar:

$ git config --global http.sslbackend schannel
$ git config --global http.sslcainfo /mingw64/ssl/certs/ca-bundle.crt

Portanto, my C:\Program Files\Git\etc\gitconfigcontém o seguinte:

[http]
    sslBackend = schannel
    sslCAinfo = /mingw64/ssl/certs/ca-bundle.crt

Além disso, escolhi a mesma opção mencionada aqui ao instalar o Git.

Espero que ajude!


1

Para corrigir o problema específico do certificado SSL do erro : não é possível obter o certificado do emissor local no git

Eu tive o mesmo problema com os certificados Let's Encrypt.

Um site com https é necessário:

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

mas git pull diz:

fatal: unable to access 'https://example.com/git/demo.git/': SSL certificate problem: unable to get local issuer certificate

Para corrigi-lo, também precisamos adicionar:

SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

-5

Use este comando antes para executar a atualização / instalação do compositor:

git config --global http.sslverify false
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.