2009-11-18 16 views
12

Sto eseguendo PHP 5.2.6 su Windows, ho extension=php_curl.dll e extension=php_openssl.dll non commentato in php.ini; come tale posso vedere quanto segue in phpinfo:Come posso ottenere il funzionamento SSL in fsockopen?

curl 
cURL support  enabled 
cURL Information libcurl/7.16.0 OpenSSL/0.9.8g zlib/1.2.3 

openssl 
OpenSSL support  enabled 
OpenSSL Version  OpenSSL 0.9.8g 19 Oct 2007 

io non sono sicuro che avere cURL permesso è di vitale importanza a questo, ma dal momento che detto OpenSSL ho pensato di includere qui comunque per completezza.


Quello che voglio fare è semplice: fare una richiesta POST a un altro server su SSL utilizzando fsockopen.
Il mio codice finora è questo:

$host = 'www.redacted.com'; 
$data = 'user=redacted&pass=redacted&action=redacted'; 
$response = ""; 

if ($fp = fsockopen("ssl:{$host}", 443, $errno, $errstr, 30)) { 

    $msg = 'POST /wsAPI.php HTTP/1.1' . "\r\n"; 
    $msg .= 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; 
    $msg .= 'Content-Length: ' . strlen($data) . "\r\n"; 
    $msg .= 'Host: ' . $host . "\r\n"; 
    $msg .= 'Connection: close' . "\r\n\r\n"; 
    $msg .= $data; 
    if (fwrite($fp, $msg)) { 
     while (!feof($fp)) { 
      $response .= fgets($fp, 1024); 
     } 
    } 
    fclose($fp); 

} else { 
    $response = false; 
} 

Questo funziona bene, naturalmente, se ho appena passano in $host e utilizzare la porta 80. Ma ho davvero bisogno di inviare questo su SSL, e in questo momento non sta funzionando. $response diventa impostato su false, $errno rimane su 0 e $errstr viene impostato su php_network_getaddresses: getaddrinfo failed: No such host is known.. So che non è un problema che il server sia inattivo, o un errore di battitura nel nome host, ecc., Perché FUNZIONA se vado oltre la porta 80 in modo non sicuro. I problemi iniziano solo quando provo a passare a SSL.

Cosa devo fare per farlo funzionare?

+0

Non proprio correlato alla risposta, ma hai preso in considerazione l'utilizzo del protocollo tls? TLSv1 è essenzialmente la quarta versione di SSL e l'ha ampiamente sostituita come implementazione de facto SSL. – Powerlord

risposta

37

Questo può sembrare ovvio, ma hai provato questo invece?

if ($fp = fsockopen('ssl://'. $host, 443, $errno, $errstr, 30)) { 

non sono sicuro se il // è richiesto o no, ma le ssl e tls esempi sul PHP Internet Transports page li hanno.

P.S. Ho anche una "cosa" sulle variabili incluse nelle stringhe, nel caso ti stia chiedendo perché usi la concatenazione delle stringhe ora.

+0

Gosh, mi sento un tale idiota. Tutto ciò che è stato necessario è questo! Grazie mille. E non mi dispiace il fatto che le variabili concatenate e incluse siano incluse. Abbiamo tutti le nostre stranezze. – SoaperGEM