GNU/Linux >> Tutoriels Linux >  >> Linux

Comment résoudre le problème de protocole SSL Curl TLS à partir du code CLI et PHP

Q : Sur l'un de nos serveurs, le serveur Web n'est pas configuré pour prendre en charge SSLv2 ou SSLv3. Les deux sont désactivés côté serveur. Il ne prend en charge que TLSv1. Comment puis-je faire fonctionner curl à partir de la ligne de commande et de l'intérieur de mon code PHP ?

R : Dans la plupart des cas, curl choisira automatiquement le bon protocole et s'y connectera. Mais, vous pouvez également spécifier un protocole spécifique à utiliser pour la commande curl. Dans cet exemple, vous devez demander à CURL d'utiliser TLSv1, comme expliqué dans ce tutoriel.

Spécifier le protocole sur la ligne de commande Curl

Voici les différentes options de protocole prises en charge sur la ligne de commande par curl :

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

Dans cet exemple, ce serveur particulier fonctionne sur HTTP normal. Aucun problème ici.

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

Reportez-vous à :15 exemples pratiques de commandes Linux cURL

Mais, si vous utilisez SSLv3, en utilisant l'option -3, il renvoie le message d'erreur "échec de la prise de contact d'alerte sslv3".

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

Si vous utilisez SSLv2, en utilisant l'option -2, il renvoie le message d'erreur "Protocole SSL inconnu".

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

Dans ce cas, sur ce serveur particulier, il ne prend en charge que TLS. Utilisez donc l'option -1 comme indiqué ci-dessous.

$ 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

Dans ce cas, puisque nous utilisons l'adresse IP, qui ne correspond pas au certificat SSL installé sur le serveur Web. Nous obtenons donc le message d'erreur "SSL3_GET_SERVER_CERTIFICATE :échec de la vérification du certificat" ci-dessus.

Curl effectue par défaut la vérification du certificat SSL. Si vous utilisez un bundle d'autorité CA, le nom du bundle par défaut est curl-ca-bundle.crt. Vous pouvez spécifier un ensemble différent à l'aide de l'option –cacert.

Mais, dans notre cas, nous voulons utiliser le protocole TLSv1, mais sans la vérification du certificat SSL. Pour cela, utilisez l'option -k (ou l'option –insecure), qui n'effectuera pas la vérification du certificat SSL.

Voici une utilisation de l'option -k.

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

Si vous souhaitez en savoir plus sur l'erreur générée par la commande CURL, utilisez l'option -v. Comme vous le voyez ci-dessous. Même lorsque nous n'avons pas passé l'option de protocole, à partir de la sortie de la commande, nous pouvons voir qu'il essaie d'utiliser SSLv2 pour cela.

$ 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 

Solution à partir de la ligne de commande

Reportez-vous à :wget vs curl :comment télécharger des fichiers à l'aide de wget et curl

Ainsi, dans notre cas, étant donné que SSLv2 et SSLv3 sont désactivés côté serveur, et pour une raison quelconque, si curl ne définit pas automatiquement le bon protocole, ce qui suit fonctionne lorsque nous voulons utiliser uniquement le protocole TLSv1 avec curl de la ligne de commande comme ci-dessous.

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

Si vous voulez voir les détails de ce que cela fait exactement, passez l'option -v comme indiqué ci-dessous.

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

Ce qui précède peut également être fait en utilisant les options alternatives suivantes

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

Encore une fois, dans la commande ci-dessus :

  • -1 (ou) –tlsv1 pour TLSv1 (SSL)
  • -k (ou) –non sécurisé pour autoriser les connexions aux sites SSL sans certificats (H)
  • -v (or) –verbose pour rendre l'opération plus bavarde (v minuscule)

Solution de PHP

À partir de votre code PHP, si vous utilisez les fonctions cURL et souhaitez définir les options de protocole, vous devez utiliser la fonction curl_setopt ou curl_setopt_array.

Utilisez curl_setopt si vous souhaitez définir une seule option.

curl_setopt($c, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

Dans ce qui précède :

  • $c est la variable curl que vous avez obtenue de la fonction curl_init(), lorsque vous avez créé une nouvelle ressource cURL à partir de votre programme PHP.
  • CURLOPT_SSLVERSION est un nom d'option curl.
  • CURL_SSLVERSION_TLSv1 est une valeur curl pour l'option correspondante dans le paramètre #2

Vous pouvez également utiliser un chiffre au lieu de "CURL_SSLVERSION_TLSv1". Dans cet exemple, cela équivaut à 1.

curl_setopt($c, CURLOPT_SSLVERSION, 1);

Voici les valeurs CURLOPT_SSLVERSION possibles que vous pouvez définir. Vous pouvez soit utiliser la constante descriptive ou le nombre correspondant qui sont indiqués ci-dessous.

  • 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)

Lorsque vous souhaitez définir plusieurs options CURL, utilisez curl_setopt_array comme indiqué ci-dessous. Ici, en plus de définir CURLOPT_SSLVERSION, il définit également quelques autres options de boucle.

Dans ce cas, le 2ème paramètre sera un tableau qui contiendra plusieurs options CURL comme indiqué ci-dessous.

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

Linux
  1. Qu'est-ce qu'une commande cURL et comment l'utiliser ?

  2. Émettez des certificats SSL gratuits et signés par une autorité de certification pour les serveurs Web de LetsEncrypt

  3. Comment rétrograder Php de 5.3.x à 5.2.x ?

  4. Comment compiler et installer un logiciel à partir du code source sous Linux

  5. Comment utiliser sched_getaffinity et sched_setaffinity sous Linux à partir de C ?

Comment installer Drupal 8 avec Apache, MySQL et SSL sur Ubuntu 15.10

Comment installer Drupal 8.1 avec Nginx, PHP-FPM et SSL sur Ubuntu 16.04

Comment vérifier la date d'expiration SSL sur Plesk

Comment réparer les déconnexions automatiques de WHM et cPanel

Comment installer et configurer Memcached sur CentOS 8

Comment installer et configurer PHP OPcache sur Ubuntu 18.04