connessione https utilizzando CURL dalla riga di comando


127

Sono nuovo nel mondo Curl e Cacerts e sto affrontando un problema durante la connessione a un server. Fondamentalmente, ho bisogno di testare la connettività su https da una macchina a un'altra macchina. Ho un URL a cui devo collegarmi dalla Macchina A (una macchina Linux) Ho provato questo al prompt dei comandi

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

e ottenuto quanto segue:

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

Passando attraverso alcuni articoli su Internet ho fatto questo:

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

e ho ottenuto qualche risposta incluso il certificato del server (all'interno -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----).

Cosa dovrei fare dopo da qui. Penso che dovrò semplicemente copiare e incollare il testo all'interno BEGIN CERTIFICATE & END CERTIFICATEe salvarlo in un file. Ma che tipo di file dovrebbe essere? .pem, .crt? .. Cosa dovrei fare dopo?

Ho provato questo - ho copiato il testo all'interno BEGIN CERTIFICATE & END CERTIFICATEe salvato in un .crtfile - lo ho chiamato come my-ca.crt( ho provato anche la stessa cosa nominandolo come my-ca.pemfile) e poi ho fatto questo:

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

Ma ho avuto lo stesso errore.


Non sono sicuro della soluzione che stai suggerendo, ma stavo solo cercando informazioni simili e ho trovato questo sito utile per l'utilizzo del ricciolo con PHP unitstep.net/blog/2009/05/05/…
— MauroPerez,

1
puoi anche aggiungere --insecureper ignorare l'errore SSL.
— Alexej Magura,

le versioni più recenti di arricciatura (ad es. 7.64) non riconoscono le cifre precedenti come RC4-SHA - l'utilizzo della versione precedente di arricciatura (7.46) mi ha aiutato serverfault.com/questions/889631/…
— hello_earth,

Risposte:


142

Ho avuto lo stesso problema: stavo recuperando una pagina dal mio sito, che era servita su HTTPS, ma curl stava dando lo stesso messaggio "Problema certificato SSL". Ci ho aggirato aggiungendo un -kflag alla chiamata per consentire connessioni non sicure.

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

Modifica: ho scoperto la radice del problema. Stavo usando un certificato SSL (da StartSSL, ma non credo che importi molto) e non avevo impostato correttamente il certificato intermedio. Se hai lo stesso problema di user1270392 sopra, probabilmente è una buona idea testare il tuo certificato SSL e risolvere eventuali problemi prima di ricorrere alla curl -kcorrezione.


5
-k flag è una bella scorciatoia. Ha funzionato per me!
— Tidydee,

45

Soluzione semplice

Questa è la mia sceneggiatura quotidiana:

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

Produzione:

* 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
Pertanto, si consente una --insecureconnessione tramite TSL, tutti i giorni ...
— Brethlosze,

2
@Brethlosze Grazie per il tuo commento. Ma non è così. Il punto è quello di ottenere le informazioni SSL da tutti i tipi di certificati.
— Antonio Feitosa,

30

È necessario fornire l'intera catena di certificati per arricciare, poiché l'arricciatura non viene più fornita con certificati CA. Poiché l'opzione cacert può utilizzare solo un file, è necessario concatenare le informazioni della catena completa in 1 file

Copia la catena di certificati (dal tuo browser, ad esempio) in binario codificato DER x.509 (.cer). Fallo per ogni certificato.

Converti i certificati in PEM e concateli in 1 file.

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"

Ho scritto un blog su come farlo qui: http://javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html


1
Puoi spiegare lo scopo del passaggio userName e Password? Cosa succede se sto scrivendo un client Java, devo passare userName e password nell'intestazione della richiesta GET, in quel caso?
— Shubhi224,

@ Shubhi224 non se il tuo server https non richiede una semplice autenticazione per le richieste GET. Ho dovuto usare l'autenticazione poiché era una chiamata REST che lo richiedeva.
— Somaiah Kumbera,

Come indicato in questa risposta "È necessario fornire l'intera catena di certificati per arricciarsi, poiché l'arricciatura non viene più fornita con certificati CA".
— Mohamed Bana,

16

usare --cacertper specificare un .crtfile. ca-root-nss.crtper esempio.


6

In realtà ho avuto questo tipo di problema e lo risolvo con questi passaggi:

  1. Ottieni il pacchetto di certificati CA radice da qui: https://curl.haxx.se/ca/cacert.pem e salvalo su local

  2. Trova il php.inifile

  3. Imposta curl.cainfocome il percorso dei certificati. Quindi sarà qualcosa del tipo:

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



1

avendo risolto il problema sono stato in grado di utilizzare il file CA predefinito di sistema esistente, su debian6 questo è:

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

come root questo può essere fatto come:

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

quindi riavviare il server Web.


1

potresti usare questo

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


0

Per me, volevo solo testare un sito Web con un reindirizzamento automatico http-> https. Penso di aver già installato alcuni certificati, quindi questo da solo funziona per me su Ubuntu 16.04 in esecuzionecurl 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>


-2

Con le versioni moderne di arricciatura, è possibile semplicemente ignorare l'indirizzo IP a cui connettersi, utilizzando --resolve o --connect-to (arricciatura più recente della versione 7.49). Funziona anche con SSL / SNI. Tutti i dettagli sono nella pagina man.

Ad esempio, per sovrascrivere DNS e connettersi a www.example.com con ssl utilizzando un indirizzo IP specifico: (Questo sostituirà anche ipv6)

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

Un altro esempio, per connettersi a un particolare server back-end chiamato back-end1 sulla porta 8080

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

Ricorda di aggiungere l'intestazione host se il server deve rispondere correttamente:

-H 'Host:www.example.com' 

Non sono sicuro di come questo risponda alla domanda.
— Brethlosze,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.