web-dev-qa-db-ja.com

fsockopenでSSLを機能させるにはどうすればよいですか?

私はWindowsでPHP 5.2.6を実行していますが、php.iniでextension=php_curl.dllextension=php_openssl.dllのコメントが外されています。そのため、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について言及しているので、完全を期すためにここに含めると思いました。


私がやりたいのは簡単です。fsockopenを使用してSSL経由で別のサーバーにPOSTリクエストを送信します。
これまでの私のコードは次のとおりです。

$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経由で送信する必要があり、現在は機能していません。 $responsefalseに設定され、$errno0に留まり、$errstrphp_network_getaddresses: getaddrinfo failed: No such Host is known.に設定されます。ポート80を安全に経由しなくても機能するため、サーバーのダウンやホスト名のタイプミスなどの問題ではないことを私は知っています。 SSLに切り替えようとすると、問題が発生します。

これを機能させるにはどうすればよいですか?

19
soapergem

これは明白に聞こえるかもしれませんが、代わりにこれを試しましたか?

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

//が必要かどうかはわかりませんが、 PHPインターネットトランスポートページssltlsの例にあります。

P.S.なぜ今文字列連結を使用しているのか疑問に思われるかもしれませんが、文字列に含まれる変数についても「何か」があります。

53
Powerlord