apache - SSL funciona con el navegador, wget y curl, pero falla con git
redmine (6)
Tengo un sitio web que estoy usando para alojar redmine y varios repositorios git
Esto funciona perfectamente para http, pero no puedo clonar con https, es decir,
git clone http://mysite.com/git/test.git
funciona bien, pero
git clone https://mysite.com/git/test.git
falla
Lo extraño es que https parece funcionar para todo lo demás que he probado. Si abro
https://mysite.com/git/test.git
en un navegador (probado en chrome y firefox), no obtengo errores ni advertencias. también puedo
curl https://mysite.com/git/test.git
wget https://mysite.com/git/test.git
Ambos de los cuales funcionan sin quejas ni advertencias.
Aquí está la salida verbosa de git:
$ GIT_CURL_VERBOSE=1 git clone https://[email protected]/test/test.git
Cloning into test...
Password:
* Couldn''t find host mysite.com in the .netrc file; using defaults
* About to connect() to mysite.com port 443 (#0)
* Trying 127.0.0.1... * Connected to mysite.com (127.0.0.1) port 443 (#0)
* found 157 certificates in /etc/ssl/certs/ca-certificates.crt
* server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
* Closing connection #0
* Couldn''t find host mysite.com in the .netrc file; using defaults
* About to connect() to mysite.com port 443 (#0)
* Trying 127.0.0.1... * Connected to mysite.com (127.0.0.1) port 443 (#0)
* found 157 certificates in /etc/ssl/certs/ca-certificates.crt
* server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
* Closing connection #0
error: server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none while accessing https://user/
@mysite.com/test/test.git/info/refs
fatal: HTTP request failed
Aquí está la salida detallada de curl, con la información personal cambiada:
* About to connect() to mysite.com port 443 (#0)
* Trying 127.0.0.1... connected
* Connected to mysite.com (127.0.0.1) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DHE-RSA-AES256-SHA
* Server certificate:
* subject: C=US; <... cut my certs info ...>
* start date: 2011-10-18 00:00:00 GMT
* expire date: 2013-10-17 23:59:59 GMT
* subjectAltName: mysite.com matched
* issuer: C=GB; ST=Greater Manchester; L=Salford; O=COMODO CA Limited; CN=COMODO High-Assurance Secure Server CA
* SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
> Host: mysite.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 18 Oct 2011 21:39:54 GMT
< Server: Apache/2.2.14 (Ubuntu)
< Last-Modified: Fri, 14 Oct 2011 03:20:01 GMT
< ETag: "8209c-87-4af39bb89ccac"
< Accept-Ranges: bytes
< Content-Length: 135
< Vary: Accept-Encoding
< Content-Type: text/html
< X-Pad: avoid browser bug
<
<p>Welcome to the mysite.com<p/>
* Connection #0 to host mysite.com left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
La única diferencia que puedo ver es que git parece estar usando un CAfile explícito mientras que curl usa todo el directorio? Soy nuevo en ssl (al menos en el lado del administrador), así que no estoy seguro de qué significa esto o cómo puedo configurar git para que funcione de la misma manera que curl.
Estoy usando git 1.7.5.4 y apache 2.2.14 en Ubuntu 10.04. He intentado la clonación de 3 hosts de linux diferentes (incluida otra cuenta en el propio servidor), y nada funciona.
También he usado la herramienta openssl para verificar mi certificado en el servidor:
$openssl verify -purpose sslserver -CAfile chain.crt signed.pem
signed.pem: OK
Esto puede estar relacionado con el error https://bugs.maemo.org/show_bug.cgi?id=4953 pero parece diferente porque no recibo ninguna advertencia o error en ningún otro programa.
Puede que valga la pena mencionar que estoy usando gitolite y redmine_git_hosting usando http inteligente para realizar la autenticación a través de https. Sin embargo, no creo que nada de esto tenga la culpa, porque el problema existe incluso si simplemente coloco un repositorio simple que de otra manera funciona en / var / www y accedo a él directamente. Además, git sobre ssh (con y sin gitolita) funciona.
Por favor, avíseme si tiene alguna idea de lo que podría estar mal o si desea más información. Realmente preferiría que ssl funcione correctamente, en lugar de obligar a todos a deshabilitar la verificación de certificados en git, aunque esa es una solución actual.
Gracias por leer este largo post!
El problema puede ser que no configuraste correctamente Apache
Es posible que deba agregar el nombre de su servidor al archivo de configuración de Apache /etc/apache2/sites-enabled/default-ssl.conf, por ejemplo:
ServerName demo.personalserver.com
De: https://www.progclub.org/blog/2014/09/03/gnutls_handshake-failed-using-git/#comment-96924
Encontré este error con uno de mis certificados Comodo PositiveSSL y pude arreglarlo cambiando el orden de los certificados intermedios.
Después de ordenar el certificado, me proporcionaron los siguientes archivos:
- Certificado de CA raíz - AddTrustExternalCARoot.crt
- Certificado de CA intermedio: COMODORSAAddTrustCA.crt
- Certificado de CA intermedio: COMODORSADomainValidationSecureServerCA.crt
- Certificado de comodín PositiveSSL - STAR_mydomain_com.crt
Originalmente, el orden de los certificados en el .crt
que proporcionaba a Nginx era el siguiente:
- Certificado de comodín PositiveSSL - STAR_mydomain_com.crt
- Certificado de CA intermedio: COMODORSAAddTrustCA.crt
- Certificado de CA intermedio: COMODORSADomainValidationSecureServerCA.crt
Sin embargo, revirtí el orden de los dos últimos certificados y Git ya no arroja errores de verificación.
La respuesta de XCondE solucionará el problema, pero desactivar las advertencias de seguridad siempre parece una mala idea. Si está ejecutando en un cuadro de Ubuntu, entonces el problema puede ser que el certificado de CA para su servidor web no se encuentra en el archivo /etc/ssl/certs/ca-certificates.crt. Me encontré con un servidor git alojado en un servidor web con un certificado SSL firmado por www.incommon.org.
Puede agregar el certificado intermedio a su archivo de certificados CA, de la siguiente manera:
wget http://cert.incommon.org/InCommonServerCA.crt
openssl x509 -inform DER -in InCommonServerCA.crt -out incommon.pem
cat /etc/ssl/certs/ca-certificates.crt incommon.pem > ca-certs2.crt
sudo cp /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bak
sudo cp ca-certs2.crt /etc/ssl/certs/ca-certificates.crt
Hay una buena discusión de lo que está pasando detrás de escena aquí: http://curl.haxx.se/docs/sslcerts.html
Resulta que este fue un problema gnuTLS. gnuTLS es sensible a las órdenes, mientras que openssl no lo es. Reordené los certificados en mi archivo de certificado intermedio y el problema desapareció.
exportar GIT_SSL_NO_VERIFY = 1
De http://blog.breadncup.com/2011/06/09/skip-git-ssl-verification/
ADVERTENCIA: como mencionaron algunas personas, esto deshabilita la verificación, lo que lo deja abierto a una serie de problemas de seguridad. No debe confiar en ello a largo plazo, pero en caso de necesidad, hará el trabajo.
git usa gnutls para estas cosas, lo que requiere que se especifique la CA. Esto se puede hacer por repositorio con:
git config http.sslcapath <path to CA directory>
O
git config http.sslcainfo <path to CA cert>
También puede especificar --sistema o --global.