No se puede resolver "no se puede obtener el certificado de emisor local" utilizando git en Windows con certificado autofirmado

283

Estoy usando Git en Windows. Instalé el paquete msysGit. Mi repositorio de prueba tiene un certificado autofirmado en el servidor. Puedo acceder y usar el repositorio usando HTTP sin problemas. Pasar a HTTPS da el error:

Problema con el certificado SSL: no se puede obtener el certificado de emisor local.

Tengo el certificado autofirmado instalado en las Autoridades de certificación raíz de confianza de mi máquina cliente Windows 7. Puedo buscar la URL del repositorio HTTPS en Internet Explorer sin mensajes de error.

Esta publicación de blog de Philip Kelley explicó que cURL no utiliza el almacén de certificados de la máquina cliente. Seguí el consejo de la publicación del blog para crear una copia privada curl-ca-bundle.crty configurar Git para usarlo. Estoy seguro de que Git está usando mi copia. Si cambio el nombre de la copia; Git se queja de que falta el archivo.

Pegué mi certificado, como se menciona en la publicación del blog, sigo recibiendo el mensaje "no se puede obtener el certificado de emisor local".

Verifiqué que Git todavía estaba trabajando clonando un repositorio de GitHub a través de HTTPS.

Lo único que veo que es diferente a la publicación del blog es que mi certificado es la raíz: no hay una cadena para alcanzarlo. Mi certificado originalmente vino de hacer clic en el enlace IIS8 IIS Manager 'Crear certificado autofirmado'. Tal vez eso hace que un certificado sea diferente de alguna manera a lo que espera cURL.

¿Cómo puedo hacer que Git / cURL acepte el certificado autofirmado?

RichardHowells
fuente
1
También verifique si su red local tiene permitido enviar archivos al repositorio de github. Puede haber alguna restricción de firewall o antivirus.
shasi kanth
Si alguien enfrenta este error mientras usa Bower, cree un archivo .bowerrc con contenido { "strict-ssl": false }. No me agradezcas, gracias a este chico: stapp.space/fight-with-2 ¡He luchado con este error durante casi 5 horas, directamente!
Ganesh Jadhav

Respuestas:

267

Abra Git Bash y ejecute el comando si desea deshabilitar completamente la verificación SSL.

git config --global http.sslVerify false

Nota: Esta solución puede abrirlo a ataques como ataques de hombre en el medio . Por lo tanto, vuelva a activar la verificación lo antes posible:

git config --global http.sslVerify true
Samir
fuente
70
Esta respuesta derrota la seguridad de SSL al permitir ataques de hombre en el medio. Otras respuestas ya explican cómo configurar git para confiar en el certificado específico que necesita.
dsh
12
horrible respuesta, ni siquiera les dices que vuelvan a activar SSL. Es por eso que ocurren vulnerabilidades de seguridad.
Edgar Aroutiounian
Si está utilizando Gitblit, entonces no hay otra opción en lugar de hacer sshVerify false.
Samir
24
Para deshabilitar la verificación TLS / SSL para un solo comando git, use el siguiente comando:git -c http.sslVerify=false clone https://domain.com/path/to/git
Maxim Suslov
1
Hay varias soluciones que ya se proporcionan a continuación, y ya he sugerido los contras. Entonces, depende de usted qué soluciones está eligiendo para resolver el problema.
Samir
154

El problema es que git usa de forma predeterminada el backend criptográfico "Linux".

Comenzando con Git para Windows 2.14, ahora puede configurar Git para usar SChannel, la capa de red de Windows incorporada como el backend criptográfico. Esto significa que utilizará el mecanismo de almacenamiento de certificados de Windows y no necesita configurar explícitamente el mecanismo de almacenamiento curl de CA: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380123(v= vs.85) .aspx

Solo ejecuta:

git config --global http.sslbackend schannel

Eso debería ayudar.

El uso de schannel es ahora la configuración estándar al instalar git para Windows, también se recomienda no retirar repositorios por SSH, si es posible, ya que https es más fácil de configurar y es menos probable que sea bloqueado por un firewall, lo que significa menos posibilidades de falla.

Ihor Zenich
fuente
1
Sin embargo, tenga en cuenta que esta solución puede hacer que git config --global http.sslCAInfo <my-server-self-signed-cert.pem>no funcione. Configuré http.sslCAInfopara usar un certificado autofirmado para mi servidor, y es la razón (puede que no sea la misma que OP) que encontré "Problema de certificado SSL: no se puede obtener el certificado de emisor local" cuando lo hago, por ejemplo, a git clone https://github.com/Microsoft/vscode.git. Finalmente, utilicé la respuesta de stackoverflow.com/a/47196562/1323552 (Ben PP Tung) para ajustar mi configuración sslCAInfo específica de mi servidor git para resolverla.
Johnny Wong
95

También tuve este problema. En mi caso, estaba tratando de obtener un enlace Git posterior a la recepción para actualizar una copia de trabajo en un servidor con cada inserción. Intenté seguir las instrucciones en el blog al que te vinculaste. Tampoco funcionó para mí y anular la configuración por usuario tampoco parecía funcionar.

Lo que terminé teniendo que hacer fue deshabilitar la verificación SSL (como se menciona en el artículo) para Git en su conjunto. No es la solución perfecta, pero funcionará hasta que pueda encontrar una mejor.

Edité el archivo de texto de configuración de Git (con mi aplicación neutral de final de línea favorita como Notepad ++) ubicada en:

C: \ Archivos de programa (x86) \ Git \ etc \ gitconfig

En el bloque [http], agregué una opción para deshabilitar sslVerify. Se veía así cuando terminé:

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

Eso hizo el truco.

NOTA:

  • Esto deshabilita la verificación SSL y no se recomienda como una solución a largo plazo.

  • Puede deshabilitar este repositorio que aún no es excelente, pero localiza la configuración.

  • Con la llegada de LetsEncrypt.org, ahora es bastante simple, automatizado y gratuito configurar SSL como alternativa a los certificados autofirmados y niega la necesidad de desactivar sslVerify.

kiddailey
fuente
145
Esto derrota el propósito de SSL.
syaz
49
puede usar el comando "git config --global http.sslVerify false" para deshabilitar la verificación SSL
CleanCoder
66
Gracias por señalar la sslCAinfoentrada de configuración; pero no estoy votando la respuesta ya que no tiene mucho sentido deshabilitar permanentemente SSL para git en todo el sistema (¿ha intentado deshabilitarlo en todo el sistema, luego clonar, luego volver a habilitarlo y luego deshabilitarlo en el config local de git para el repositorio recién clonado?).
7heo.tk
35
Para un comando único, no hay necesidad de cambiar los archivos de configuración:git -c http.sslVerify=false clone https://...
pts
8
Mejor solución aquí: blogs.msdn.microsoft.com/phkelley/2014/01/20/…
Warren P
51

Kiddailey creo que estaba bastante cerca, sin embargo, no deshabilitaría la verificación SSL sino que simplemente proporcionaría el certificado local:

En el archivo de configuración de Git

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

O a través de la línea de comando:

git config --global http.sslCAinfo /bin/curl-ca-bundle.crt
Oliver
fuente
77
En git para windows, esto esgit config --global http.sslCAinfo /usr/ssl/certs/ca-bundle.crt
Karsten Tinnefeld
O para mígit config --global http.sslCAinfo /c/Program\ Files\ \(x86\)/Git/bin/curl-ca-bundle.crt
gorrión
Para los usuarios de MacPorts, esto esgit config --global http.sslCAinfo /opt/local/share/curl/curl-ca-bundle.crt
miken32
3
Con Git 2.8 puede usar git config --list --show-originpara ver dónde está configurada la configuración http.sslCAinfo
Anish
La ubicación de mi certificado en Mac es: ~ / macports / share / curl / curl-ca-bundle.crt
user3282611
47

También enfrenté este problema. Y finalmente se resolvió al obtener orientación de este blog de MSDN .

Actualizar

En realidad, debe agregar el certificado en el archivo de certificados de git curl-ca-bundel.cert que reside en el directorio Git \ bin.

Pasos

  1. Abra su página de github en el navegador y haga clic en el icono de candado en la barra de direcciones.
  2. En la pequeña ventana emergente abierta, navegue hasta el enlace 'ver certificado', se abrirá una ventana emergente.
  3. En el que navega a la pestaña de certificados (tercero en mi caso). Seleccione el nodo superior que es el certificado raíz. Y presione el botón copiar certificado en la parte inferior y guarde el archivo.
  4. En el explorador de archivos, navegue por el directorio Git \ bin y abra curl-ca-bundle.crt en el editor de texto.
  5. Abra el archivo de certificado exportado (en el paso 3) también en el editor de texto.
  6. Copie todo el contenido del certificado exportado al final de curl-ca-bundle.crt y guárdelo.

Finalmente verifica el estado. Tenga en cuenta que el archivo de copia de seguridad curl-ca-bundle.crt antes de editar se mantiene seguro.

Nadeem Jamali
fuente
3
"navegue por el directorio Git \ bin y abra curl-ca-bundle.crt" ¡No hay curl-ca-bundle.crt en git \ bin!
Anton K
@AntonK si no existe, cree uno usted mismo en el bloc de notas y cámbiele el nombre por curl-ca-bundle.crt. Otros pasos siguen siendo los mismos.
Nadeem Jamali
16
@AntonK Puede llamarse justo ca-bundle.crty ubicarse en mingw64\ssl\certso mingw32\ssl\certs.
Ian Kemp el
Lo usé para SourceTree de Atlassian. La instalación de GIT incluida se encuentra en% userprofile% \ appdata \ local \ attlassian \ sourcetree \ git_local. curl-ca-bundle.crt ya existía, junto con mi certificado raíz exportado codificado en base64.
Xanothos
40

La respuesta a esta pregunta usando makecert for Development SSL me solucionó esto.

No sé por qué, pero el certificado creado por el simple enlace 'Crear certificado autofirmado' en el Administrador de IIS no funciona. Seguí el enfoque en la pregunta vinculada de crear e instalar un CA Root autofirmado; luego usar eso para emitir un Certificado de autenticación del servidor para mi servidor. Los instalé a ambos en IIS.

Eso hace que mi situación sea la misma que la publicación del blog mencionada en la pregunta original. Una vez que el certificado raíz fue copiado / pegado en curl-ca-bundle.crt, el combo git / curl quedó satisfecho.

RichardHowells
fuente
"No sé por qué, pero el certificado creado por el simple enlace 'Crear certificado autofirmado' en el Administrador de IIS no funciona ..." - Lo mejor que puedo decir es que crea certificados con formato incorrecto. Hay muchas reglas al crear certificados X.509; el "hacer lo mínimo para que funcione" ya no funciona bien. Consulte también ¿Cómo firma la Solicitud de firma de certificado con su Autoridad de certificación y Cómo crear un certificado autofirmado con openssl?
jww
Esto funcionó para mí, pero me colgué temporalmente en la parte "Instalé a ambos en IIS". Para clarificar a otros ... el certificado del servidor se asigna en IIS, y la CA raíz debe importarse a "Autoridades de certificación raíz de confianza" a través de la utilidad de administrador de certificados de Windows (certmgr.msc)
Philip
26

Para evitar deshabilitar la verificación SSL por completo o duplicar / piratear el archivo de certificado CA incluido que utiliza git, puede exportar la cadena de certificados del host a un archivo y hacer que git lo use:

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

Si eso no funciona, puede deshabilitar la verificación SSL solo para el host:

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

Nota: Sujeto a posibles ataques de hombre en el medio cuando la verificación SSL está desactivada.

zionyx
fuente
44
Vale la pena señalar que la --globalopción no es necesaria: si omite --global, la configuración solo se aplica a ese repositorio de git en particular.
Wes Turner
19

Acabo de tener el mismo problema pero usando sourcetree en Windows Los mismos pasos para GIT normal en Windows también. Siguiendo los siguientes pasos pude resolver este problema.

  1. Obtenga el árbol del certificado del servidor Esto se puede hacer usando Chrome. Navegue para ser la dirección del servidor. Haga clic en el icono del candado y vea los certificados. Exporte toda la cadena de certificados como formato de archivos codificados base64 (PEM).
  2. Agregue los certificados a la cadena de confianza de su archivo de configuración de confianza GIT Ejecute "git config --list". encuentre la configuración "http.sslcainfo" que muestra dónde se encuentra el archivo de confianza del certificado. Copie todos los certificados en el archivo de cadena de confianza, incluidos "- -BEGIN- -" y "- -END- -".
  3. Asegúrese de agregar toda la cadena de certificados al archivo de certificados

Esto debería resolver su problema con los certificados autofirmados y el uso de GIT.

Intenté usar la configuración "http.sslcapath" pero esto no funcionó. Además, si no incluyera toda la cadena en el archivo de certificados, esto también fallaría. Si alguien tiene punteros sobre estos, avíseme ya que lo anterior debe repetirse para una nueva instalación.

Si este es el GIT del sistema, puede usar las opciones en HERRAMIENTAS -> pestaña Opciones de GIt para usar el GIT del sistema y esto también resuelve el problema en sourcetree.

JamesD
fuente
2
"si no incluyera toda la cadena en el archivo de certificados, entonces esto también fallaría" - Acabo de encontrarme con este problema
Amani Kilumanga
En cuanto a incluir toda la cadena, tengo dos certs por encima del github cert. ¿Los incluyo en orden como root-> next cert-> github cert en el archivo sslcainfo.crt?
Jecoms
Pude acceder a los paquetes de repositorio de git simplemente agregando el certificado raíz.
Jecoms
Para futuros lectores. No tengo idea si importa, pero pongo el certificado "raíz" (superior) al FINAL del archivo (http.sslcainfo). Y luego, cuando me alejé del certificado raíz en la cadena, puse ese certificado encima de la entrada anterior del archivo (http.sslcainfo).
granadaCoder
11

En el caso de los repositorios de github (o cualquier certificado que no esté autofirmado) , elegir a continuación mientras instala Git-on-windows, resolvió el problema.

ingrese la descripción de la imagen aquí

Jawad Al Shaikh
fuente
1
Parecía haber respondido una pregunta diferente. La pregunta del OP se refería a certificados autofirmados en clientes Windows.
jww
@jww el título de la pregunta es un mensaje de error de git que se muestra incluso si el repositorio NO es SSL autofirmado.
Jawad Al Shaikh
Esto me hizo pasar el error, pero para mí acceder a GitHub Enterprise requería cierta generación de claves y agregar claves públicas / privadas.
ΩmegaMan
1
Si un administrador de Windows útil ha colocado el certificado autofirmado en la tienda de certificados de Windows a través de una política de grupo, entonces esta respuesta también es buena.
JamesD
7

He tenido este problema antes y lo soluciono usando la siguiente configuración.

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

Desde git 2.3.1, puede colocar https://your.domaindespués de http para indicar que el siguiente certificado es solo para él.

Ben PP Tung
fuente
1
Esta es la solución más simple y precisa que encontré, si también configuró git config --global http.sslCAInfo <your-server-self-signed-cert.pem>antes (por lo tanto, provoca el error "no se puede obtener el certificado del emisor local")
Johnny Wong
ESTA fue la respuesta correcta a mi problema (y no simplemente "deshabilitar la validación SSL" ~~). No sabía que puede especificar la ubicación del certificado solo para un host específico. ¡As!
Rocío García Luque
1
  1. Descargue el certificado de este enlace: https://github.com/bagder/ca-bundle
  2. Agréguelo a C:\Program Files\Git\bin yC:\Program Files\Git\mingw64\bin

Entonces intente algo como: git clone https://github.com/heroku/node-js-getting-started.git

Alex
fuente
1

Una cosa que me confundió fue el formato de la ruta (en mi PC con Windows). Originalmente tuve esto:

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

Pero eso falló con el error "no se puede obtener el certificado del emisor local".

Lo que finalmente funcionó fue esto:

git config --global http.sslCAInfo "C:\\certs\\cacert.pem"
Wayne S.
fuente
1

En mi caso, como he instalado el Terminal ConEmu para Windows 7, crea ca-bundledurante la instalación enC:\Program Files\Git\mingw64\ssl\certs .

Por lo tanto, tengo que ejecutar los siguientes comandos en la terminal para que funcione:

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

Por lo tanto, mi C:\Program Files\Git\etc\gitconfigcontiene lo siguiente:

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

Además, elegí la misma opción que se menciona aquí al instalar Git.

¡Espero que ayude!

rc.adhikari
fuente
1

Para solucionar el error específico del problema del certificado SSL: no se puede obtener el certificado de emisor local en git

Tuve el mismo problema con los certificados Let's Encrypt.

Un sitio web con https que solo necesitamos:

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

pero git pull dice:

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

Para solucionarlo, también necesitamos agregar:

SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
Sergio
fuente
-5

Use este comando antes para ejecutar la actualización / instalación del compositor:

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