GNU/Linux >> Linux Esercitazione >  >> Linux

Come risolvere il problema del protocollo SSL TLS Curl da CLI e codice PHP

D: Su uno dei nostri server, il server web non è configurato per supportare SSLv2 o SSLv3. Entrambi sono disabilitati sul lato server. Supporta solo TLSv1. Come posso far funzionare curl sia dalla riga di comando che dall'interno del mio codice PHP?

R: Nella maggior parte dei casi, curl sceglierà automaticamente il protocollo corretto e si connetterà ad esso. Ma puoi anche specificare un protocollo specifico da usare per il comando curl. In questo esempio, devi indicare a CURL di utilizzare TLSv1, come spiegato in questo tutorial.

Specifica il protocollo sulla riga di comando di curl

Di seguito sono elencate le varie opzioni di protocollo supportate sulla riga di comando da curl:

  • -0 (o) –http1.0 per HTTP 1.0 (H)
  • -1 (o) –tlsv1 per TLSv1 (SSL)
  • -2 (o) –sslv2 per SSLv2 (SSL)
  • -3 (o) –sslv3 per SSLv3 (SSL)

In questo esempio, questo particolare server funziona su HTTP normale. Nessun problema qui.

$ curl http://192.168.101.1
<html><body><h1>It works!</h1></body></html>

Fare riferimento a questo:15 pratici esempi di comandi cURL di Linux

Tuttavia, se utilizzi SSLv3, utilizzando l'opzione -3, viene restituito il messaggio di errore "sslv3 alert handshake failure".

$ curl -3 https://192.168.101.1
curl: (35) error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

Se utilizzi SSLv2, utilizzando l'opzione -2, viene restituito il messaggio di errore "Protocollo SSL sconosciuto".

$ curl -2 https://192.168.101.1
curl: (35) Unknown SSL protocol error in connection to 192.168.101.1:443 

In questo caso, su questo particolare server, supporta solo TLS. Quindi, usa l'opzione -1 come mostrato di seguito.

$ curl -1 https://192.168.101.1
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

In questo caso, poiché stiamo utilizzando l'indirizzo IP, che non corrisponde al certificato SSL installato sul server web. Quindi, stiamo ricevendo il messaggio di errore "SSL3_GET_SERVER_CERTIFICATE:verifica certificato non riuscito" sopra.

Curl per impostazione predefinita esegue la verifica del certificato SSL. Se si utilizza un bundle di autorità CA, il nome bundle predefinito è curl-ca-bundle.crt. Puoi specificare un pacchetto diverso usando l'opzione –cacert.

Ma, nel nostro caso, vogliamo utilizzare il protocollo TLSv1, ma senza la verifica del certificato SSL. Per questo, usa l'opzione -k (o l'opzione –insecure), che non eseguirà la verifica del certificato SSL.

Quello che segue è un utilizzo dell'opzione -k.

$ curl -k https://192.168.101.1
curl: (35) Unknown SSL protocol error in connection to 192.168.101.1:443 

Se vuoi conoscere maggiori dettagli sull'errore generato dal comando CURL, usa l'opzione -v. Come vedi sotto. Anche quando non abbiamo passato l'opzione del protocollo, dall'output del comando, possiamo vedere che sta tentando di utilizzare SSLv2 per questo.

$ curl -k -v https://192.168.101.1
* About to connect() to 192.168.101.1 port 443
*   Trying 192.168.101.1... connected
* Connected to 192.168.101.1 (192.168.101.1) port 443
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSLv2, Client hello (1):
Unknown SSL protocol error in connection to 192.168.101.1:443 
* Closing connection #0
curl: (35) Unknown SSL protocol error in connection to 192.168.101.1:443 

Soluzione dalla riga di comando

Fare riferimento a questo:wget vs curl:come scaricare file usando wget e curl

Quindi, nel nostro caso, poiché SSLv2 e SSLv3 sono disabilitati sul lato server e per qualche motivo se curl non imposta automaticamente il protocollo corretto, quanto segue funziona quando vogliamo utilizzare solo il protocollo TLSv1 con curl dalla riga di comando come mostrato di seguito.

$ curl -k -1 https://192.168.101.1
<html><body><h1>It works!</h1></body></html>

Se vuoi vedere i dettagli di ciò che fa esattamente, passa l'opzione -v come mostrato di seguito.

$ curl -k -1 -v https://192.168.101.1

Quanto sopra può essere fatto anche usando le seguenti opzioni alternative

$ curl --insecure --tlsv1 --verbose https://192.168.101.1

Di nuovo, nel comando precedente:

  • -1 (o) –tlsv1 per TLSv1 (SSL)
  • -k (o) –non sicuro per consentire connessioni a siti SSL senza certificati (H)
  • -v (o) –verbose per rendere l'operazione più loquace (v minuscolo)

Soluzione da PHP

Dal tuo codice PHP, se stai usando le funzioni cURL e ti piace impostare le opzioni del protocollo, dovresti usare la funzione curl_setopt o curl_setopt_array.

Usa curl_setopt se vuoi impostare una sola opzione.

curl_setopt($c, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

In quanto sopra:

  • $c è la variabile curl che hai ottenuto dalla funzione curl_init(), quando hai creato una nuova risorsa cURL dal tuo programma PHP.
  • CURLOPT_SSLVERSION è un nome di opzione curl.
  • CURL_SSLVERSION_TLSv1 è un valore curl per l'opzione corrispondente nel parametro#2

Puoi anche utilizzare un numero invece di "CURL_SSLVERSION_TLSv1". In questo esempio, questo equivale a 1.

curl_setopt($c, CURLOPT_SSLVERSION, 1);

I seguenti sono possibili valori CURLOPT_SSLVERSION che puoi impostare. Puoi utilizzare la costante descrittiva o il numero corrispondente mostrato di seguito.

  • CURL_SSLVERSION_DEFAULT (0)
  • CURL_SSLVERSION_TLSv1 (1)
  • CURL_SSLVERSION_SSLv2 (2)
  • CURL_SSLVERSION_SSLv3 (3)
  • CURL_SSLVERSION_TLSv1_0 (4)
  • CURL_SSLVERSION_TLSv1_1 (5)
  • CURL_SSLVERSION_TLSv1_2 (6)

Quando vuoi impostare più opzioni CURL, usa curl_setopt_array come mostrato di seguito. Qui, oltre a impostare CURLOPT_SSLVERSION, imposta anche alcune altre opzioni di curl.

In questo caso, il 2° parametro sarà un array che conterrà più opzioni CURL come mostrato di seguito.

curl_setopt_array($c, array
(
  CURLOPT_SSL_VERIFYHOST => 0,
  CURLOPT_SSL_VERIFYPEER => 0,
  CURLOPT_SSLVERSION => 1
));

Linux
  1. Come chiamare la funzione C in C++, la funzione C++ in C (mix di C e C++)

  2. Come gestire lo stato dell'account Zimbra dalla CLI

  3. Come ottenere la console Linux $ COLUMNS e $ ROWS da PHP cli?

  4. Come posso eseguire il codice PHP dalla riga di comando?

  5. Come usare sched_getaffinity e sched_setaffinity in Linux da C?

Come installare Drupal 8 con Apache, MySQL e SSL su Ubuntu 15.10

Come installare Drupal 8.1 con Nginx, PHP-FPM e SSL su Ubuntu 16.04

Come controllare la data di scadenza SSL su Plesk

Come risolvere le disconnessioni automatiche da WHM e cPanel

Come installare e configurare Memcached su CentOS 8

Come installare e configurare PHP OPcache su Ubuntu 18.04