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?
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