¿Cómo puedo hacer que git acepte un certificado autofirmado?

648

Usando Git, ¿hay alguna manera de decirle que acepte un certificado autofirmado?

Estoy usando un servidor https para alojar un servidor git pero por ahora el certificado está autofirmado.

Cuando intento crear el repositorio allí por primera vez:

git push origin master -f

Me sale el error:

error: Cannot access URL     
https://the server/git.aspx/PocketReferences/, return code 22

fatal: git-http-push failed
Ian Vink
fuente
44
¿Cómo sabes que el problema es el certificado?
Ámbar
1
En cambio, desde una PC, la herramienta Git de otro usuario les permite ignorar el certificado y funciona. Desde una Mac, no puedo entender cómo ignorar.
Ian Vink
El error que obtuve, con git 2.1.1: "fatal: no se puede acceder a 'https: //.../project.git/': problema con el certificado SSL: certificado autofirmado en la cadena de certificados"
Stan Kurdziel
en OSX / macintosh, parece que git no usará la sslcainfoopción. si puede usar curl --cacertcon éxito para extraer su ruta de repositorio pero git no funciona, debe agregar el certificado al misterioso programa OSX Keychain. más aquí superuser.com/questions/605900/...
amwinter
Creo que este documento es útil gist.github.com/evantoli/f8c23a37eb3558ab8765
Mofaggol Hoshen

Respuestas:

1170

Para aceptar permanentemente un certificado específico

Prueba http.sslCAPatho http.sslCAInfo. La respuesta de Adam Spires da algunos buenos ejemplos. Esta es la solución más segura a la pregunta.

Para deshabilitar la verificación TLS / SSL para un solo comando git

intente pasar -ca gitcon la variable de configuración adecuada, o use la respuesta de Flow :

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

Para deshabilitar la verificación SSL para un repositorio específico

Si el repositorio está completamente bajo su control, puede intentar:

git config --global http.sslVerify false

Hay bastantes opciones de configuración SSL en git. De la página del manual de 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.

Algunas otras opciones de configuración SSL útiles:

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.
Christopher
fuente
40
'git config --global http.sslVerify false' hizo el truco. ¡Gracias!
Chris Story
110
Nunca debe deshabilitar globalmente la verificación de certificados TLS (/ SSL) .
Flujo
44
@Flow - Estoy completamente de acuerdo. He editado esta respuesta (ahora bastante antigua) para ser más polémico sobre la desactivación de la verificación del certificado TLS / SSL.
Christopher
8
para mí esto git -c http.sslVerify=false clone https://domain.com/path/to/gitresolvió mi problema, gracias ...
Fernando Gomes
2
@Flow Si estamos en un entorno de trabajo donde nuestro empleador es el MITM , ¿qué alternativa hay para desactivar globalmente TLS / SSL?
Stevoisiak
165

Puedes configurarlo GIT_SSL_NO_VERIFYpara true:

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

o, alternativamente, configure Git para que no verifique la conexión en la línea de comando:

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

Tenga en cuenta que si no verifica los certificados SSL / TLS, entonces es susceptible a los ataques MitM .

Fluir
fuente
2
También puede usar el -cindicador activado gitpara modificar un valor de configuración para un solo comando. Sin embargo, creo que esta sintaxis es más limpia.
Christopher
1
Ahh, no lo sabía -cen git. De hecho, creo que es la solución más limpia en lugar de contaminar el medio ambiente. :)
Flujo
1
@SkylarSaveland Tenga en cuenta que git -c http.sslVerify=false <gitSubCommand>también puede funcionar a través de intermediarios.
Flujo
1
Cabe señalar que esta solución te abre para ataques de hombres en el medio.
omikron
2
La respuesta describe solo la opción menos segura .
cp.engr
139

No soy un gran fanático de [EDITAR: versiones originales de las] respuestas existentes, porque deshabilitar las comprobaciones de seguridad debería ser el último recurso, no la primera solución ofrecida. Aunque no puede confiar en los certificados autofirmados en el primer recibo sin algún método adicional de verificación, el uso del certificado para gitoperaciones posteriores al menos hace la vida mucho más difícil para los ataques que solo ocurren después de haber descargado el certificado. En otras palabras, si el certificado que descargaste es genuino, entonces eres bueno a partir de ese momento. Por el contrario, si simplemente deshabilita la verificación, está abierto a cualquier tipo de ataque de hombre en el medio en cualquier momento .

Para dar un ejemplo específico: el famoso repo.or.czrepositorio proporciona un certificado autofirmado . Puedo descargar ese archivo, colocarlo en algún lugar como /etc/ssl/certs, y luego hacer:

# 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

Tenga en cuenta que el uso local git configaquí (es decir, sin --global) significa que este certificado autofirmado solo es confiable para este repositorio en particular, lo cual es bueno. También es más agradable que usar, GIT_SSL_CAPATHya que elimina el riesgo de githacer la verificación a través de una Autoridad de certificación diferente que podría verse comprometida.

Adam Spires
fuente
3
Casualmente, http.sslCAPath utiliza la lógica ssl_capath de libcurl. Creo que en realidad podría almacenar cualquier número de certificados en el /etc/ssl/certs/directorio y resolvería eficientemente todo lo que necesita. No he probado esto, eso sí, pero podría permitirte usar un --globalmontón de certs. Vale la pena probar, sin embargo.
Christopher
66
Teniendo en cuenta los riesgos de deshabilitar la verificación SSL por completo, y el hecho de que la pregunta era "¿cómo puedo hacer que git acepte un certificado autofirmado?", Esta debería ser la respuesta aceptada.
PLNech
55
En un mundo ideal, habría algo comogit config http.validCertFingerprint <base64-encoded-hash-of-certifcate>
Flow
1
La única respuesta en Internet que realmente funciona para mi escenario. Esa es la biblioteca privada Composer VCS, alojada en Gitlab autohospedado sobre SSL que necesito requerir en el proyecto versionado por git.
Dejv
1
De un nuevo clon; Esto se puede hacer en una sola línea: git clone --config http.sslCAInfo=<path_to_cert> https://repo.or.cz/org-mode.git(No es necesario llamar a un comando 'git config' después).
Aaron
39

Configuración de certificado autofirmado de Git

tl; dr

¡NUNCA deshabilite toda la verificación SSL!

Esto crea una mala cultura de seguridad. No seas esa persona.

Las claves de configuración que busca son:

Estos son para configurar certificados de host en los que confía

Estos son para configurar SU certificado para responder a los desafíos de SSL.

Aplicar selectivamente la configuración anterior a hosts específicos.

Global .gitconfigpara autoridades de certificación autofirmadas

Por mi bien y el de mis colegas, aquí es cómo logramos que funcionen los certificados autofirmados sin desactivar sslVerify . Edite su.gitconfig para usar git config --global -eagregar estos:

# 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

Referencias

Especifique config cuando git clone -ing

Si necesita aplicarlo por repositorio, la documentación le indica que simplemente ejecute git config --local en su directorio de repositorio. Bueno, eso no es útil cuando todavía no ha clonado el repositorio localmente, ¿verdad?

Puedes hacer el global -> local hokey-pokey configurando su configuración global como se indica arriba y luego copiar esa configuración a su configuración de repositorio local una vez que clona ...

O lo que puede hacer es especificar los comandos de configuracióngit clone que se aplican al repositorio de destino una vez que se clona.

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

Un trazador de líneas

EDITAR: Vea la respuesta de VonC que señala una advertencia sobre las rutas absolutas y relativas para versiones específicas de git desde 2.14.x / 2.15 a este único trazador de líneas

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

Si está intentando esto en CentOS y su .pemarchivo le está dando

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

Entonces querrá esta respuesta de StackOverflow sobre cómo curlusa NSS en lugar de Open SSL.

Y te gustaría querer reconstruir curldesde la fuente :

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 la computadora ya que libcurl todavía está en la memoria como una biblioteca compartida

Python, pip y conda

Relacionado : ¿Cómo agregar un certificado de CA Root personalizado a la Tienda de CA utilizada por pip en Windows?

Josh Peak
fuente
Tenía que asegurarme de que el certificado del servidor autofirmado estuviera en formato PEM antes de que Git lo aceptara. Además, algunas de las respuestas anteriores indican que solo se necesita proporcionar la ruta a la carpeta del certificado utilizando http.sslCAPath. En mi caso, tuve que usar http.sslCAInfopara especificar el archivo específico. Hacerlo permitió que Git se conectara a nuestro GitHub privado sin desactivar la validación SSL.
Zarepheth
@ Zarepheth Gracias por esa información. Me encontré con el mismo problema que requería tanto CAPath como CAInfo. Como nuestro CA Cert tenía el formato PEM, pasé por alto documentarlo. He actualizado la respuesta con estas adiciones. Me alegra que hayas podido conectarte de forma segura.
Josh Peak
Esta es probablemente la mejor respuesta de "solución" a largo plazo si se ve obligado a usar HTTPS para clonar y no puede simplemente usar SSH para evitar el desorden del certificado.
dragon788
¡Estaba a punto de agregar esta respuesta! Me alegro de que alguien más lo haya descubierto.
Franklin Yu
14

Sigo encontrando este problema, así que escribí un script para descargar el certificado autofirmado del servidor e instalarlo en ~ / .gitcerts, luego actualizar git-config para que apunte a estos certificados. Está almacenado en la configuración global, por lo que solo necesita ejecutarlo una vez por control remoto.

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

Craig
fuente
Agradable, aunque sería aún mejor tener la opción de usar la configuración local en lugar de la global.
Adam Spires
3
Siempre se puede bifurcar y eliminar la opción --global ;-)
Craig
Esto es bastante bueno, ¿viene en lote?
Halter
10

Esta respuesta está extraída de este artículo escrito por Michael Kauffman.

Use Git para Windows con un certificado SSL corporativo

Problema :

Si tiene un certificado SSL corporativo y desea clonar su repositorio desde la consola o VSCode, obtendrá el siguiente error:

fatal: no se puede acceder a ' https: // myserver / tfs / DefaultCollection / _git / Proj / ': problema con el certificado SSL: no se puede obtener el certificado del emisor local

Solución :

  1. Exporte el certificado autofirmado raíz a un archivo. Puede hacerlo desde su navegador.

  2. Busque el archivo "ca-bundle.crt" en su carpeta git (versión actual C: \ Archivos de programa \ Git \ usr \ ssl \ certs pero ha cambiado en el pasado). Copie el archivo a su perfil de usuario. Ábralo con un editor de texto como VSCode y agregue el contenido de su certificado exportado al final del archivo.

Ahora tenemos que configurar git para usar el nuevo archivo:

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

Esto agregará la siguiente entrada a su archivo .gitconfig en la raíz de su perfil de usuario.

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

AperioOculus
fuente
1
Gracias, esta respuesta me pareció la más fácil y segura para Windows.
Pisu
7

Para deshabilitar la verificación SSL para un repositorio específico Si el repositorio está completamente bajo su control, puede intentar:

 git config --global http.sslVerify false
Saurabh Verma
fuente
3

Tenga cuidado cuando esté usando un revestimiento usando sslKey o sslCert, como en la respuesta 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

Solo Git 2.14.x / 2.15 (Q3 2015) podría interpretar una ruta como ~username/mykeycorrectamente (mientras que todavía puede interpretar una ruta absoluta como/path/to/privatekey ).

Ver commit 8d15496 (20 de julio de 2017) por Junio ​​C Hamano ( gitster) .
Ayudado por: Charles Bailey ( hashpling) .
(Fusión por Junio ​​C Hamano - gitster- en commit 17b1e1d , 11 ago 2017)

http.c: http.sslcerty http.sslkeyson ambos nombres de ruta

Cuando se creó la ruta de código moderna http_options () para analizar varias opciones http. * En 29508e1 ("Aislar la funcionalidad de solicitud HTTP compartida", 2005-11-18, Git 0.99.9k), y luego se corrigió la interacción entre los múltiples archivos de configuración en 7059cd9 (" http_init(): Reparar el análisis del archivo de configuración", 2009-03-09, Git 1.6.3-rc0), analizamos variables de configuración como http.sslkey, por http.sslcertejemplo, cadenas simples, porque git_config_pathname()eso comprende que el ~[username]/prefijo " " no existía.

Más tarde, convertimos algunos de ellos (a saber, http.sslCAPathy http.sslCAInfo) para usar la función, y agregamos variables como http.cookeyFile http.pinnedpubkeyusar la función desde el principio. Por eso, todas estas variables entienden el ~[username]/prefijo " ".

Haga las dos variables restantes http.sslcerty http.sslkey, también consciente de la convención, ya que ambas son claramente rutas de acceso a los archivos.

VonC
fuente
3

Usando la versión de 64 bits de Git en Windows, solo agregue el certificado CA autofirmado en estos archivos:

  • C: \ Archivos de programa \ Git \ mingw64 \ ssl \ certs \ ca-bundle.crt
  • C: \ Archivos de programa \ Git \ mingw64 \ ssl \ certs \ ca-bundle.trust.crt

Si es solo un certificado autofirmado del servidor, agréguelo a

  • C: \ Archivos de programa \ Git \ mingw64 \ ssl \ cert.pem
Flaviu
fuente
Esta fue la mejor manera de lidiar con el firewall de nuestra empresa que vuelve a firmar todo el tráfico HTTPS. Acabo de tomar el archivo crt formateado PEM del certificado de firewall como texto y copiarlo pegado a ca-bundle y funciona de maravilla.
Mitten.O
3

Verifique la configuración de su antivirus y firewall.

De un día para otro, git ya no funcionaba. Con lo que se describió anteriormente, descubrí que Kaspersky coloca un certificado raíz personal de antivirus autofirmado en el medio. No logré dejar que Git aceptara ese certificado siguiendo las instrucciones anteriores. Me di por vencido con eso. Lo que funciona para mí es desactivar la función para escanear conexiones cifradas.

  1. Abra Kaspersky
  2. Configuración> Adicional> Red> No escanear conexiones cifradas

Después de esto, git funciona nuevamente con sslVerify habilitado.

Nota. Esto todavía no me satisface, porque me gustaría tener activada esa característica de mi antivirus. En la configuración avanzada, Kaspersky muestra una lista de sitios web que no funcionarán con esa función. Github no figura como uno de ellos. Lo comprobaré en el foro de Kaspersky. Parece que hay algunos temas, por ejemplo, https://forum.kaspersky.com/index.php?/topic/395220-kis-interfering-with-git/&tab=comments#comment-2801211

Henk
fuente
1

En el .gitconfig archivo puede agregar el valor dado a continuación para que aceptable

sslCAInfo = /home/XXXX/abc.crt

RahulMohan Kolakandy
fuente
Esto es equivalente al segundo paso en la respuesta de Adam
Michael - ¿Dónde está Clay Shirky?
1

Lo hago así:

git init
git config --global http.sslVerify false
git clone https://myurl/myrepo.git
Tadej
fuente
3
¡No lo uses --global! Se muestran muchos tutoriales, --globalpero es una muy mala idea en general y http.sslVerifyen particular. Tan pronto como tenga más de un clon de diferentes proyectos, compañías y equipos en la computadora, puede tener problemas rápidamente. Por ejemplo, la identificación de usuario y los correos electrónicos que se filtran de un proyecto a otro pueden ser bastante embarazosos. Y usar --globalon http.sslVerifypuede abrirlo a todo tipo de problemas de seguridad. Por lo tanto: no lo use --global, a menos que sea plenamente consciente de los efectos secundarios y esté preparado para correr el riesgo.
Martin
1

En Windows esto funcionó para mí:

Agregue el contenido de su certificado autofirmado al final del archivo ca-bundle . Incluyendo el ----- COMENZAR CERTIFICADO ----- y ----- FINALIZAR CERTIFICADO ----- líneas

La ubicación del archivo ca-bundle suele ser C: \ Archivos de programa \ Git \ mingw64 \ ssl \ certs

Luego, agregue la ruta del paquete ca archivo a la configuración global de git. El siguiente comando hace el truco:git config --global http.sslCAInfo "C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt"

Observación: ¡La ruta depende de su ruta local del archivo ca-bundle!

rw026
fuente
1

Yo uso una máquina Windows y este artículo me ayudó. Básicamente abrí ca-bundle.crt en el bloc de notas y agregué certificados de cadena en él (todos ellos). Este problema generalmente ocurre para las redes de la compañía donde tenemos intermediarios sentados entre el sistema y el repositorio de git. Necesitamos exportar todos los certificados en la cadena de certificados, excepto el certificado de hoja en formato base 64 y agregarlos a ca-bundle.crt y luego configurar git para este archivo crt modificado.

amor gupta
fuente
1

No es una buena práctica establecer http.sslVerify falso. En cambio, podemos usar el certificado SSL.

Por lo tanto, el agente de compilación usará https con certificado SSL y PAT para la autenticación. ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Copie el contenido del archivo cer incluyendo –begin — y –end--.

git bash on build agent => git config –global http.sslcainfo "C: / Archivos de programa / Git / mingw64 / ssl / certs / ca-bundle.crt" Vaya a este archivo y agregue el contenido .cer.

Por lo tanto, el agente de compilación puede acceder al certificado SSL

Palash Roy
fuente
0

Mi respuesta puede llegar tarde pero funcionó para mí. Puede ayudar a alguien.

Intenté los pasos mencionados anteriormente y eso no resolvió el problema.

prueba estogit config --global http.sslVerify false

Manjuboyz
fuente