L’url da Curl POST a HTTPS fornisce l’errore SSLRead ()

Ho recentemente aggiornato a OSX 10.10 Yosemite e io dall’aggiornamento non riesco più a eseguire Curl POST su un URL SSL.

Ho usato per la prima volta wp_remote_request call di wordpress e wp_remote_request anche provato a usare curl in php. Entrambi (come previsto) danno lo stesso messaggio di errore:

Numero errore: 56

Error String: SSLRead () return error -9806

Nota: quando eseguo il POST su HTTP, funziona bene. Penso che sia un’impostazione in PHP.ini o nel mio apache (ho perso il mio file HTTPD.conf originale dopo l’aggiornamento …).

Qualcuno mi può aiutare?

Ho visto questo errore accadere quando php è compilato con una versione di cURL che utilizza Secure Transport di Apple in Yosemite e la destinazione della richiesta URL non supporta SSLv3 (che probabilmente era disabilitato a causa della vulnerabilità di POODLE ). Qual è l’output di questo comando?

 $ php -i | grep "SSL Version" 

Sospetto che vedrai questo:

 SSL Version => SecureTransport 

È ansible superare questo problema installando una versione di php che utilizza una versione di cURL che utilizza OpenSSL invece di SecureTransport. Questo è più facile con homebrew . Quindi installalo prima se non lo hai già. Se homebrew è installato ma non hai eseguito l’ brew update a Yosemite, fallo prima. Assicurati inoltre di aver installato XCode> = 6.1 e gli ultimi strumenti da riga di comando XCode. brew doctor ti dirà se hai fatto tutto bene.

Aggiungi i tocchi Homebrew qui sotto che ti serviranno per far installare php preparato. Salta questo passaggio se questi repository sono già stati toccati. Se non sei sicuro che questi repository siano già stati toccati, esegui i comandi qui sotto. Nella peggiore delle ipotesi, riceverai un Warning: Already tapped! innocuo Warning: Already tapped!

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

Quindi installa curl con openssl:

 $ brew install --with-openssl curl 

Quindi installa php usando il curl che hai appena installato e preparato openssl:

 $ brew install --with-homebrew-curl --with-httpd24 php55 
  • se si utilizza apache, assicurarsi di aggiungere LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so al proprio /etc/apache2/httpd.conf e riavviare apache.

  • se non si utilizza Apache 2.4, è ansible rimuovere --with-httpd24 dal comando precedente.

  • se si utilizza nginx, seguire le istruzioni di avvertenza per l’avvio di fpm:

    Per avviare php-fpm all’avvio:

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

Installa eventuali estensioni php di cui avrai bisogno ad es. mcrypt .

 $ brew install php55-mcrypt 

Dopo aver finito, esegui di nuovo questo:

 $ php -i | grep "SSL Version" 

E dovresti vedere:

 SSL Version => OpenSSL/1.0.2h 

E ora, ri-testare la tua applicazione e l’ SSLRead() return error -9806 dovrebbe andare via.

Questo errore SSL (codice OSStatus: 9806) indica che la connessione è stata interrotta dal server a causa di un errore nello stabilire la connessione (ad es. Su alcuni comandi non validi). Ciò sembra accadere solo in occasioni in cui la connessione SSL all’host remoto si interrompe.

Questo non è ben documentato dal manuale SSL ( SSL_get_error ), tuttavia questo messaggio di errore proviene da libcurl built che viene utilizzato dal back-end TLS SecureTransport / Darwinssl (puoi trovare il suo OSStatus nel file di intestazione SecureTransport.h ):

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

Dalla mia esperienza, ciò accade solitamente quando si è dietro il proxy o connessi a una rete limitata che utilizza un meccanismo di autenticazione.

Quindi verifica di essere connesso alla rete giusta (tramite WiFi) e che l’altro HTTPS funzioni correttamente. In caso contrario, verifica se è necessario specificare le credenziali proxy o se l’ISP sta eseguendo l’override della catena di certificati e richiede un qualche tipo di autenticazione o in pratica sta bloccando l’accesso a determinati siti nel proprio firewall.

Ho avuto un problema simile con SSLRead() return error -9806 , e inoltre avevo SSL Version => SecureTransport .

Ma nel mio caso il problema era che stavo impostando l’opzione arricciatura CURLOPT_HTTP_VERSION :

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

Se rimuovi questa opzione, cURL deciderà quale versione utilizzare per impostazione predefinita. Controlla la documentazione di curl_setopt per ulteriori informazioni.

Questo ha funzionato per me, e non ho avuto bisogno di cambiare nulla con cURL né PHP. Ma questa è una soluzione di uno dei molti casi in cui appare l’ error -9806 .