2009-11-18 9 views
12

Używam PHP 5.2.6 na Windowsie, mam extension=php_curl.dll i extension=php_openssl.dll odkomentowane w php.ini; takich jak widzę następujące w phpinfo:Jak uzyskać obsługę SSL w 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 

nie jestem pewien, że o cURL włączona jest niezbędna do tego, ale ponieważ wspomniane OpenSSL myślałem, że to i tak go tutaj dla kompletności.


Co chcę zrobić jest prosty: uczynić żądanie POST do innego serwera over SSL przy użyciu fsockopen.
Mój kod do tej pory to:

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

Działa to dobrze, oczywiście jeśli tylko przechodzą w $host i korzystać z portu 80. Ale naprawdę trzeba wysłać ten over SSL, a teraz nie działa. $response zostaje ustawiony na false, $errno pozostaje na 0, a $errstr zostaje ustawiony na php_network_getaddresses: getaddrinfo failed: No such host is known.. Wiem, że nie chodzi o to, że serwer jest wyłączony, ani literówka na nazwę hosta, itp., Ponieważ działa, jeśli przejdę przez port 80 bez zabezpieczenia. Problemy pojawiają się tylko wtedy, gdy próbuję przejść na SSL.

Co mam zrobić, aby to zadziałało?

+0

Naprawdę niezwiązany z odpowiedzią, ale czy zamiast tego rozważałeś użycie protokołu TLC? TLSv1 jest w istocie czwartą wersją SSL i szeroko zastąpił go jako de facto implementację SSL. – Powerlord

Odpowiedz

37

To może wydawać się oczywiste, ale czy próbowałeś tego zamiast tego?

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

Nie jestem pewien, czy // jest wymagana, czy nie, ale przykłady ssl i tls na PHP Internet Transports page je mieć.

P.S. Też mam "rzecz" o uwzględnionych zmiennych w łańcuchach, na wypadek, gdybyś się zastanawiał, dlaczego teraz używa połączenia ciągów.

+0

Cześć, Czuję się jak taki idiota. Wystarczyło to! Dziękuję bardzo. I nie przeszkadza mi w tym, że pet oblekają zmienne połączone ze zmiennymi. Wszyscy mamy nasze dziwactwa. – SoaperGEM