2009-11-18 2 views
12

Я запускаю PHP 5.2.6 на Windows, у меня есть extension=php_curl.dll и extension=php_openssl.dll раскомментирован в php.ini; как таковой, я могу увидеть следующее phpinfo:Как заставить SSL работать в 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 

Я не уверен, что с CURL включен жизненно важно для этого, но так как в нем упоминается OpenSSL я думал, что включить его здесь в любом случае для полноты картины.


То, что я хочу сделать, это просто: сделать запрос POST на другой сервер по протоколу SSL с использованием fsockopen.
Мой код до сих пор это:

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

Это прекрасно работает, конечно, если бы я просто передать в $host и использовать порт 80. Но мне действительно нужно отправить это через SSL, и сейчас он не работает. $response получает значение false, $errno остается на 0 и $errstr получает значение php_network_getaddresses: getaddrinfo failed: No such host is known.. Я знаю, что это не проблема с сервером, или опечатка в имени хоста и т. Д., Потому что он работает, если я перехожу через порт 80 безотказно. Проблемы возникают только при попытке перейти на SSL.

Что мне делать, чтобы получить эту работу?

+0

Не имеет отношения к ответу, но вы считали, что вместо этого используете протокол tls? TLSv1 по сути является четвертой версией SSL и широко заменил его как фактическую реализацию SSL. – Powerlord

ответ

37

Это может показаться очевидным, но вы попробовали это вместо этого?

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

Я не уверен, если // требуется или нет, но ssl и tls примеров на PHP Internet Transports page есть.

P.S. У меня также есть «вещь» о включенных переменных в строках, если вам интересно, почему она использует конкатенацию строк сейчас.

+0

Гоша, я чувствую себя таким идиотом. Все, что нужно! Огромное спасибо. И я не возражаю против того, что домашнее животное разоблачает включенные против конкатенированных переменных. У всех нас есть свои причуды. – SoaperGEM