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.

usuario1270392
fuente
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.

Dave Child
fuente
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
Antonio Feitosa
fuente
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

Somaiah Kumbera
fuente
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.

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

geckob
fuente
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.

Jasen
fuente
1

podrías usar esto

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

Ahmed Ali
fuente
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>

SamCyanide
fuente
-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' 
ingvarha
fuente
No estoy seguro de cómo esto responde la pregunta.
Brethlosze