2009-11-18 6 views
12

Ich verwende PHP 5.2.6 unter Windows, ich habe extension=php_curl.dll und extension=php_openssl.dll unkommentiert in php.ini;Wie bekomme ich 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 

Ich bin nicht sicher, dass cURL wird an diesen wichtige Option aktiviert ist, aber da es OpenSSL erwähnt dachte ich, dass ich es hier sowieso auf Vollständigkeit gehören würde: als solche kann ich folgende in phpinfo sehen.


Was ich tun möchte, ist einfach: eine POST-Anforderung mit fsockopen auf einem anderen Server über SSL machen.
Mein Code so weit ist dies:

$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; 
} 

Das funktioniert natürlich gut, wenn ich in $host und verwenden nur passieren Port 80. Aber ich brauche wirklich diese über SSL zu schicken, und es ist jetzt nicht funktioniert. $response wird auf false gesetzt, $errno bleibt auf 0, und $errstr wird auf php_network_getaddresses: getaddrinfo failed: No such host is known. gesetzt. Ich weiß, dass es kein Problem mit dem Ausfall des Servers oder einem Tippfehler im Hostnamen usw. ist, weil es funktioniert, wenn ich über Port 80 ungesichert gehe. Die Probleme beginnen erst, wenn ich versuche, zu SSL zu wechseln.

Was kann ich tun, damit das funktioniert?

+0

Nicht wirklich mit der Antwort verbunden, aber haben Sie in Betracht gezogen, stattdessen das TLS-Protokoll zu verwenden? TLSv1 ist im Wesentlichen die vierte Version von SSL und hat diese als de facto SSL-Implementierung weitgehend abgelöst. – Powerlord

Antwort

37

Das klingt vielleicht offensichtlich, aber haben Sie das stattdessen versucht?

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

Ich bin mir nicht sicher, ob die // erforderlich ist oder nicht, aber die ssl und tls Beispiele auf der PHP Internet Transports page sie haben.

P.S. Ich habe auch eine "Sache" über eingeschlossene Variablen in Strings, falls Sie sich wundern, warum es jetzt String-Verkettung verwendet.

+0

Gosh, ich fühle mich wie ein Idiot. Alles was es brauchte war das! Ich danke dir sehr. Und ich habe nichts dagegen, dass das Tier über eingeschlossene vs verkettete Variablen ärgert. Wir alle haben unsere Macken. – SoaperGEM