configurar Git para aceptar un certificado de servidor autofirmado particular para un control remoto https particular

167

El administrador del sistema para un proyecto en el que estoy ha decidido que SSH es "demasiado problema"; en su lugar, ha configurado Git para que sea accesible a través de una https://URL (y autenticación de nombre de usuario / contraseña). El servidor para esta URL presenta un certificado autofirmado, por lo que aconsejó a todos desactivar la validación del certificado. Esto no me parece una buena configuración, en cuanto a seguridad.

¿Es posible decirle a Git que para X remoto (o mejor, cualquier control remoto en cualquier repositorio que empiece https://$SERVERNAME/) es aceptar un certificado en particular, y solo ese certificado? Básicamente reduplicate el comportamiento de la clave del servidor SSH.

zwol
fuente
Estás preguntando sobre C Git en Unix, supongo.
Piotr Findeisen
Yah Bueno, posiblemente también Windows, pero nadie está haciendo eso ahora.
zwol
55
WTF? @Zack tiene toda la razón sobre las verificaciones de certificados. Cuando su administrador le dice que debe desactivar las comprobaciones de certificados, también puede desactivar TLS en el servidor, ya que cada uno está desactivando la protección contra un ataque de hombre en el medio.
Rudi
@Rudi, ¿sigue siendo así si usan una dirección IP para acceder al servidor? (Parece que la búsqueda de DNS es la forma en que MITM se interpone, así que creo que la dirección IP debería ser inmune a esto.)
Chris
66
@ Chris Sí, sigue siendo el caso. Un enrutador MITM puede pretender ser cualquier dirección IP que desee. (Usted sabe que esas páginas intersticiales de subir al wifi gratuito en el aeropuerto de Son MITMs Trate de acceder a una página en algún momento por la dirección IP?..)
Zwol

Respuestas:

295

Brevemente:

  1. Obtenga el certificado autofirmado
  2. Póngalo en algún ~/git-certs/cert.pemarchivo (p . Ej. )
  3. Establecer gitpara confiar en este certificado utilizando el http.sslCAInfoparámetro

En mas detalles:

Obtenga un certificado autofirmado del servidor remoto

Suponiendo que la URL del servidor es repos.sample.comy desea acceder a ella a través del puerto 443.

Hay múltiples opciones, cómo obtenerlo.

Obtener certificado usando openssl

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

Capture la salida en un archivo cert.pemy elimine todo menos parte entre (e incluyendo) -BEGIN CERTIFICATE-y-END CERTIFICATE-

El contenido del archivo resultante ~ / git-certs / cert.pem puede verse así:

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

Obtenga un certificado utilizando su navegador web

Uso Redmine con repositorios Git y accedo a la misma URL para la interfaz de usuario web y para el acceso a la línea de comandos git. De esta manera, tuve que agregar una excepción para ese dominio en mi navegador web.

Utilizando Firefox, fui Options -> Advanced -> Certificates -> View Certificates -> Servers, encontré el host autofirmado, lo seleccioné y, usando el Exportbotón, obtuve exactamente el mismo archivo, tal como lo creé openssl.

Nota: Me sorprendió un poco, no se menciona visiblemente el nombre de la autoridad. Esto esta bien.

Tener el certificado de confianza en un archivo dedicado

Los pasos anteriores darán lugar a tener el certificado en algún archivo. No importa qué archivo sea, siempre que sea visible para su git al acceder a ese dominio. solía~/git-certs/cert.pem

Nota: Si necesita más certificados autofirmados de confianza, colóquelos en el mismo archivo:

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

Esto funcionará (pero lo probé solo con un solo certificado).

Configure git para confiar en este certificado

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

También puede intentar hacer ese sistema en todo el sistema, utilizando en --systemlugar de --global.

Y pruébelo: ahora podrá comunicarse con su servidor sin tener que recurrir a:

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

Si ya configuró su git para ignorar los certificados SSL, deshabilítelo:

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

y también puede verificar que lo hizo todo correctamente, sin errores ortográficos:

$ git config --global --list

lo que debería enumerar todas las variables, lo ha configurado globalmente. (Escribí mal http a htt).

Jan Vlcinsky
fuente
1
Creo que esta respuesta es más correcta y completa que la aceptada. gracias @ Jan Vlcinsky
Alfredo Cavalcanti
1
Después de eso, los certificados habituales firmados por la autoridad dejan de funcionar, por lo que no puedo extraer, por ejemplo, de Github. ¿Hay alguna manera de agregar un certificado autofirmado sin desactivar los certificados firmados por la autoridad?
Michael Ivko
44
Solución @MichaelIvko que tiene en cuenta los 'certificados habituales firmados por la autoridad' descritos aquí (debe agregar su certificado al archivo 'curl-ca-bundle.crt'): blogs.msdn.com/b/phkelley/archive/2014/
20/01
3
El problema con este enfoque es que elimina efectivamente todas las CA predeterminadas que vienen con git (por ejemplo, después de hacer esto, no podrá extraer de github). Lo más probable es que eso no sea lo que la mayoría está buscando. Un mejor ejemplo es agregar la nueva CA raíz a una copia de Git \ bin \ curl-ca-bundle.crt, y luego hacer referencia a la nueva copia de curl-ca-bundle.crt desde su gitconfig.
crimbo
3
funciona en windows! exporte todos los certificados de la cadena de certificados como archivo X.509 codificado en Base64 (.CER) Junte todos los archivos y haga referencia a este archivo. Asegúrese de no tener espacios en la ruta al archivo cert (use rutas de la vieja escuela)
pscheit
3

Ajustes del usuario OSX.

Seguir los pasos de la respuesta aceptada funcionó para mí con una pequeña adición al configurar en OSX.

Puse el cert.pemarchivo en un directorio debajo de mi usuario registrado de OSX y, por lo tanto, me hizo ajustar la ubicación del certificado de confianza.

Configure git para confiar en este certificado:

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