如何在fsockopen中使用SSL?

时间:2009-11-18 18:09:37

标签: php ssl openssl fsockopen

我在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发送它,而现在它无法正常工作。 $response设置为false$errno保持0$errstr设置为php_network_getaddresses: getaddrinfo failed: No such host is known.。我知道这不是服务器故障的问题,也不是主机名中的拼写错误等问题,因为如果我不安全地通过端口80,它会起作用。问题只有在我尝试切换到SSL时才会开始。

我该怎么做才能让它发挥作用?

1 个答案:

答案 0 :(得分:52)

这听起来很明显,但你试过这个吗?

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

我不确定是否需要//,但PHP Internet Transports page上的ssltls示例包含它们。

P.S。我还有一个关于字符串中包含变量的“事情”,如果你想知道为什么它现在使用字符串连接。