configure o Git para aceitar um certificado de servidor autoassinado específico para um https remoto específico

167

O administrador do sistema para um projeto em que eu participei decidiu que o SSH é "demais"; em vez disso, ele configurou o Git para ser acessível por meio de uma https://URL (e autenticação de nome de usuário / senha). O servidor para este URL apresenta um certificado autoassinado, portanto ele recomendou a todos que desativassem a validação de certificado. Isso não me parece uma boa configuração, em termos de segurança.

É possível dizer ao Git que, para o X remoto (ou melhor, qualquer remoto em qualquer repositório que tenha início https://$SERVERNAME/), é necessário aceitar um certificado específico, e somente esse certificado? Reduplique basicamente o comportamento da chave do servidor do SSH.

zwol
fonte
Você está perguntando sobre o C Git no Unix, presumo?
Piotr Findeisen 31/01
Yah. Bem, concebivelmente também o Windows, mas ninguém está fazendo isso agora.
Zwol 31/01/12
5
WTF? @ Zack, você está absolutamente certo sobre as verificações de certificado. Quando seu administrador diz que você deve desativar as verificações de certificado, ele também pode desativar o TLS no servidor, pois todos estão desabilitando a proteção contra um ataque man-in-the-middle.
Rudi
@ Rudi, esse ainda é o caso se eles usarem um endereço IP para acessar o servidor? (Parece que a pesquisa de DNS é como MITM fica Inbetween então eu acho que o endereço IP deve ser imune a isso.)
Chris
6
@ Chris Sim, ainda é o caso. Um roteador MITM pode fingir ser qualquer endereço IP que desejar. (Você sabe essas páginas intersticiais que você começa no wifi gratuito no aeroporto de São MITMs Tente acessar a página por algum endereço IP?..)
Zwol

Respostas:

295

Resumidamente:

  1. Obter o certificado autoassinado
  2. Coloque-o em algum ~/git-certs/cert.pemarquivo (por exemplo )
  3. Configure gitpara confiar neste certificado usando o http.sslCAInfoparâmetro

Em mais detalhes:

Obter certificado autoassinado do servidor remoto

Supondo que a URL do servidor seja repos.sample.come você deseja acessá-la pela porta 443.

Existem várias opções, como obtê-lo.

Obter certificado usando o openssl

$ openssl s_client -connect repos.sample.com:443

Capture a saída em um arquivo cert.peme exclua tudo, exceto parte entre (e incluindo) -BEGIN CERTIFICATE-e-END CERTIFICATE-

O conteúdo do arquivo resultante ~ / git-certs / cert.pem pode ter a seguinte aparência:

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

Obter certificado usando seu navegador da web

Eu uso o Redmine com repositórios Git e acesso a mesma URL para interface do usuário da web e para acesso à linha de comando git. Dessa forma, tive que adicionar uma exceção para esse domínio no meu navegador da web.

No Firefox, Options -> Advanced -> Certificates -> View Certificates -> Serversencontrei o host autoassinado, o selecionei e, usando o Exportbotão, obtive exatamente o mesmo arquivo, criado com o uso openssl.

Nota: Fiquei um pouco surpreso, não há nome da autoridade visivelmente mencionada. Isto é bom.

Ter o certificado confiável em arquivo dedicado

As etapas anteriores devem resultar em um certificado em algum arquivo. Não importa, qual arquivo é, desde que seja visível para o seu git ao acessar esse domínio. eu usei~/git-certs/cert.pem

Nota: Se você precisar de certificados autoassinados mais confiáveis, coloque-os no mesmo arquivo:

-----BEGIN CERTIFICATE-----
MIIDnzCCAocCBE/xnXAwDQYJKoZIhvcNAQEFBQAwgZMxCzAJBgNVBAYTAkRFMRUw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AnOtHeRtRuStEdCeRtIfIcAtEgOeShErExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
...........
/27/jIdVQIKvHok2P/u9tvTUQA==
-----END CERTIFICATE-----

Isso deve funcionar (mas eu testei apenas com um único certificado).

Configure o git para confiar neste certificado

$ git config --global http.sslCAInfo /home/javl/git-certs/cert.pem

Você também pode tentar fazer esse sistema amplamente, usando em --systemvez de --global.

E teste: agora você poderá se comunicar com seu servidor sem recorrer a:

$ git config --global http.sslVerify false #NO NEED TO USE THIS

Se você já configurou seu git para o desconhecimento de certificados SSL, desative-o:

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

e você também pode verificar se fez tudo corretamente, sem erros de ortografia:

$ git config --global --list

o que deve listar todas as variáveis, você definiu globalmente. (Eu escrevi incorretamente o http para ott).

Jan Vlcinsky
fonte
1
acho que essa resposta é mais correta e completa do que a aceita. obrigado @Jan Vlcinsky
Alfredo Cavalcanti
1
Depois disso, os certificados assinados pelas autoridades usuais param de funcionar, então não consigo extrair, por exemplo, do Github. Existe uma maneira de adicionar um certificado autoassinado sem desativar os certificados assinados pela autoridade?
Michael Ivko
4
Solução @MichaelIvko que leva em conta os 'certificados assinados por autoridade habituais' descritos aqui (você precisa adicionar seu certificado ao arquivo 'curl-ca-bundle.crt'): blogs.msdn.com/b/phkelley/archive/2014/ 20/01 /…
Stanislav Berkov
3
O problema dessa abordagem é que ela remove efetivamente todas as CAs padrão que acompanham o git (por exemplo, depois de fazer isso, você não poderá extrair do github). Provavelmente não é isso que a maioria está procurando. Um exemplo melhor é adicionar a nova CA raiz a uma cópia do Git \ bin \ curl-ca-bundle.crt e, em seguida, referenciar a nova cópia do curl-ca-bundle.crt no seu gitconfig.
Crev
3
funciona no windows! exporte todos os certificados da cadeia de certificados como arquivo X.509 codificado em Base64 (.CER) Coloque todos os arquivos juntos e faça referência a esse arquivo. Certifique-se que você não tem espaços no caminho para o arquivo cert (uso oldschool caminhos)
pscheit
3

Ajustes do usuário OSX.

Seguir as etapas da resposta Aceita funcionou para mim com uma pequena adição ao configurar no OSX.

Coloquei o cert.pemarquivo em um diretório no meu usuário logado no OSX e, assim, fiz com que eu ajustasse o local do certificado confiável.

Configure o git para confiar neste certificado:

$ git config --global http.sslCAInfo $HOME/git-certs/cert.pem
Chris Langston
fonte