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?

RichardHowells
fonte
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
Samir
fonte
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.

Ihor Zenich
fonte
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.

kiddailey
fonte
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
8
Correção melhor aqui: blogs.msdn.microsoft.com/phkelley/2014/01/20/…
Warren P
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
Oliver
fonte
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.

Nadeem Jamali
fonte
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.

RichardHowells
fonte
"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.

zionyx
fonte
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.

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

Jawad Al Shaikh
fonte
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.

Ben PP Tung
fonte
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

Alex
fonte
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"
Wayne S.
fonte
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!

rc.adhikari
fonte
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
Sérgio
fonte
-5

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

git config --global http.sslverify false
Prashant Paliwal
fonte