Как получить SSL, работающий в fsockopen? - PullRequest
18 голосов
/ 18 ноября 2009

Я использую PHP 5.2.6 в Windows, у меня есть extension=php_curl.dll и extension=php_openssl.dll без комментариев в php.ini; в качестве такового я могу видеть следующее в phpinfo:

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.

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

1 Ответ

52 голосов
/ 23 ноября 2009

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

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

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

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

...