Подтвердить что ты не робот

Как заставить SSL работать в fsockopen?

Я запускаю 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.

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

4b9b3361

Ответ 1

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

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

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

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