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.