Conexión https usando CURL desde la línea de comando


127

Soy nuevo en el mundo de Curl and Cacerts y enfrento un problema mientras me conecto a un servidor. Básicamente, necesito probar la conectividad a través de https de una máquina a otra. Tengo una URL a la que necesito conectarme desde la Máquina A (una máquina Linux) Intenté esto en el símbolo del sistema

cmd> curl https://[my domain or IP address]

y obtuve lo siguiente:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Al revisar algunos artículos por internet, hice esto:

openssl s_client -connect <domain name or Ip address>:443

y obtuve alguna respuesta, incluido el certificado del servidor (dentro -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

¿Qué debo hacer a continuación desde aquí? Creo que tendré que copiar y pegar el texto dentro BEGIN CERTIFICATE & END CERTIFICATEy guardarlo en un archivo. Pero, ¿qué tipo de archivo debería ser? .pem, .crt? .. ¿Qué debo hacer después de eso?

Intenté esto, copié el texto dentro BEGIN CERTIFICATE & END CERTIFICATEy lo guardé en un .crtarchivo, lo nombré como my-ca.crt(también probé lo mismo nombrándolo como my-ca.pemarchivo) y luego hice esto:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

Pero tengo el mismo error.


No estoy seguro acerca de la solución que está sugiriendo, pero solo estaba buscando información similar y encontré este sitio útil para usar curl con PHP unitstep.net/blog/2009/05/05/…
MauroPerez

1
También puede agregar --insecurepara ignorar el error SSL.
Alexej Magura

las versiones más nuevas de curl (p. ej., 7.64) no reconocerían cifrados más antiguos como RC4-SHA; el uso de una versión anterior de curl (7.46) me ayudó serverfault.com/questions/889631/…
hello_earth el

Respuestas:


142

Tuve el mismo problema: estaba buscando una página de mi propio sitio, que se sirvió a través de HTTPS, pero curl estaba dando el mismo mensaje de "problema de certificado SSL". Lo solucioné agregando un -kindicador a la llamada para permitir conexiones inseguras.

curl -k https://whatever.com/script.php

Editar: descubrí la raíz del problema. Estaba usando un certificado SSL (de StartSSL, pero no creo que eso importe demasiado) y no había configurado el certificado intermedio correctamente. Si tiene el mismo problema que el usuario 1270392 anterior, probablemente sea una buena idea probar su certificado SSL y solucionar cualquier problema antes de recurrir a la curl -ksolución.


55
-k flag es un buen atajo. ¡Trabajó para mi!
tidydee

45

Solución simple

Ese es mi guión cotidiano:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Salida:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact

11
Por lo tanto, está permitiendo una --insecureconexión a través de TSL, todos los días ...
Brethlosze

2
@Brethlosze Gracias por tu comentario. Pero ese no es el caso. El punto es obtener la información SSL de todo tipo de certificados.
Antonio Feitosa

30

Debe proporcionar toda la cadena de certificados para curl, ya que curl ya no se envía con ningún certificado de CA. Dado que la opción cacert solo puede usar un archivo, debe concatenar la información de la cadena completa en 1 archivo

Copie la cadena de certificados (desde su navegador, por ejemplo) en binario codificado DER x.509 (.cer). Haga esto para cada certificado.

Convierta los certificados en PEM y concatéelos en 1 archivo.

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

Escribí un blog sobre cómo hacer esto aquí: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html


1
¿Puede explicar el propósito de pasar nombre de usuario y contraseña? ¿Qué sucede si estoy escribiendo un Cliente Java? ¿Necesito pasar el nombre de usuario y la contraseña en el encabezado de la solicitud GET, en ese caso?
Shubhi224

@ Shubhi224 no si su servidor https no requiere una autenticación simple para las solicitudes GET. Tuve que usar autenticación porque era una llamada REST que lo requería.
Somaiah Kumbera

Como se menciona en esta respuesta, "debe proporcionar toda la cadena de certificados para curl, ya que curl ya no se envía con ningún certificado de CA".
Mohamed Bana

16

use --cacertpara especificar un .crtarchivo. ca-root-nss.crtpor ejemplo.


6

En realidad tuve este tipo de problema y lo soluciono con estos pasos:

  1. Obtenga el paquete de certificados de CA raíz desde aquí: https://curl.haxx.se/ca/cacert.pem y guárdelo en local

  2. Encuentra el php.iniarchivo

  3. Configure el curl.cainfopara ser la ruta de los certificados. Entonces será algo como:

curl.cainfo = /path/of/the/keys/cacert.pem



1

habiendo resuelto el problema pude usar el archivo CA predeterminado del sistema existente, en debian6 esto es:

/etc/ssl/certs/ca-certificates.crt

como root esto se puede hacer como:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

luego reinicie el servidor web.


1

podrías usar esto

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);


0

Para mí, solo quería probar un sitio web que tenía una redirección http-> https automática. Creo que ya tenía algunos certificados instalados, así que esto solo funciona para mí en Ubuntu 16.04 corriendocurl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>


-3

Con las versiones modernas de curl, simplemente puede anular a qué dirección IP conectarse, utilizando --resolve o --connect-to (curl más reciente que la versión 7.49). Esto funciona incluso con SSL / SNI. Todos los detalles están en la página del manual.

Por ejemplo, para anular DNS y conectarse a www.example.com con ssl usando una dirección IP particular: (Esto también anulará ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

Otro ejemplo, para conectarse a un servidor de fondo particular llamado backend1 en el puerto 8080

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

Recuerde agregar el encabezado del host si el servidor necesita que responda correctamente:

-H 'Host:www.example.com' 

No estoy seguro de cómo esto responde la pregunta.
Brethlosze
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.