web-dev-qa-db-fra.com

osx 10.10 Curl POST à l'URL HTTPS génère une erreur SSLRead ()

Je viens de passer à OSX 10.10 Yosemite et depuis la mise à niveau, je ne peux plus faire Curl POST vers une URL SSL).

J'ai d'abord utilisé le wordpress's wp_remote_request appel et a également essayé d'utiliser curl en php. Les deux (comme prévu) donnent le même message d'erreur:

Numéro d'erreur: 56

Error String: SSLRead () renvoie l'erreur -9806

Note: quand je curl POST sur HTTP cela fonctionne très bien. Je pense que c'est un paramètre dans PHP.ini ou dans mon Apache (j'ai perdu mon fichier HTTPD.conf d'origine après la mise à niveau ...) .

Quelqu'un peut m'aider?

72
Mattijs

J'ai vu cette erreur se produire lorsque php est compilé avec une version de cURL qui utilise Transport sécurisé d'Apple sous Yosemite et que la cible de la demande d'URL ne prend pas en charge SSLv3 (qui a probablement été désactivé en raison de la vulnérabilité POODLE ). Quelle est la sortie de cette commande?

$ php -i | grep "SSL Version"

Je suppose que vous verrez ceci:

SSL Version => SecureTransport

Vous pouvez résoudre ce problème en installant une version de php qui utilise une version de cURL qui utilise OpenSSL au lieu de SecureTransport. Cela se fait plus facilement avec homebrew . Alors installez-le d'abord si vous ne l'avez pas déjà. Si homebrew est installé mais que vous n'avez pas exécuté brew update Depuis la mise à niveau vers Yosemite, faites-le d'abord. Assurez-vous également que vous avez installé XCode> = 6.1 et les derniers outils de ligne de commande XCode. brew doctor Vous dira si vous l'avez bien fait.

Ajoutez les robinets Homebrew ci-dessous dont vous aurez besoin pour installer php brassé. Ignorez cette étape si ces dépôts sont déjà exploités. Si vous ne savez pas si ces dépôts sont déjà exploités, exécutez simplement les commandes ci-dessous. Dans le pire des cas, vous obtiendrez un Warning: Already tapped! Inoffensif

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php

Puis installez curl avec openssl:

$ brew install --with-openssl curl

Puis installez php en utilisant le curl que vous venez d'installer et brassé openssl:

$ brew install --with-homebrew-curl --with-httpd24 php55
  • si vous utilisez Apache, veillez à ajouter LoadModule php5_module /usr/local/opt/php55/libexec/Apache2/libphp5.so à votre /etc/Apache2/httpd.conf et à redémarrer Apache.

  • si vous n'utilisez pas Apache 2.4, vous pouvez supprimer --with-httpd24 de la commande ci-dessus.

  • si vous utilisez nginx, suivez les instructions de mise en garde relatives au démarrage de fpm:

    Pour lancer php-fpm au démarrage:

    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist
    

Installez toutes les extensions php dont vous aurez besoin, par exemple. mcrypt.

$ brew install php55-mcrypt

Une fois que vous avez terminé, exécutez à nouveau ceci:

$ php -i | grep "SSL Version"

Et vous devriez voir:

SSL Version => OpenSSL/1.0.2h

Et maintenant, testez à nouveau votre application et la SSLRead() return error -9806 devrait disparaître.

142
Asaph

Cette erreur SSL (code OSStatus: 9806) signifie que le serveur a mis fin à votre connexion en raison d'une erreur lors de l'établissement de la connexion (sur une commande non valide, par exemple). Cela semble se produire uniquement lorsque la connexion SSL à l'hôte distant est interrompue.

Ceci n’est pas bien documenté par le manuel SSL ( SSL_get_error ), cependant, ce message d’erreur provient de libcurl construit qui est utilisé par le backend TLS SecureTransport/Darwinssl (vous pouvez trouver son statut OSS dans la SecureTransport.h En tête de fichier):

errSSLClosedAbort           = -9806,    /* connection closed via error */

D'après mon expérience, cela se produit généralement lorsque vous êtes derrière le proxy ou connecté à un réseau limité utilisant un mécanisme d'authentification.

Vérifiez donc que vous êtes connecté au bon réseau (via WiFi) et que votre autre HTTPS fonctionne correctement. Si ce n'est pas le cas, vérifiez si vous devez spécifier les informations d'identification du proxy ou si votre fournisseur d'accès remplace la chaîne de certificats et requiert une sorte d'authentification ou bloque l'accès à certains sites de leur pare-feu.

5
kenorb

J'ai eu un problème similaire avec l'erreur SSLRead() return error -9806, et j'avais aussi SSL Version => SecureTransport.

Mais dans mon cas, le problème était que je posais des boucles CURLOPT_HTTP_VERSION option:

$curl = curl_init();    
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

Si vous supprimez cette option, cURL décidera quelle version utiliser par défaut. Vérifiez curl_setopt documentation pour plus.

Cela a fonctionné pour moi et je n'ai rien eu à changer avec cURL ni PHP. Mais c’est la solution d’un des nombreux cas où error -9806 apparaît.

1
Daniel Batalla