2009-11-18 82 views
12

我在Windows上运行PHP 5.2.6,我有extension=php_curl.dllextension=php_openssl.dll注释掉在php.ini;因此我可以看到phpinfo如下:如何在fsockopen中使用SSL?

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 

我不知道那有卷曲启用的是这一重要的,但因为它提到的OpenSSL我想我会在这里有也无妨的完整性。


我想要做的是简单的:做一个POST请求使用fsockopen SSL上的另一台服务器。
到目前为止我的代码是这样的:

$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被在0设置为false$errno住宿,并$errstr被设置为php_network_getaddresses: getaddrinfo failed: No such host is known.。我知道这不是服务器关闭的问题,或主机名称中的错字等,因为如果我不安全地通过端口80,它会工作。这些问题只在我尝试切换到SSL时开始。

我该怎么做才能做到这一点?

+0

没有真正与答案有关,但你有没有考虑过使用tls协议呢? TLSv1实质上是SSL的第四个版本,并已广泛取代它作为事实上的SSL实现。 – Powerlord 2009-11-23 16:15:48

回答

37

这听起来可能很明显,但你尝试过这个呢?

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

我不知道是否需要或不//,但对PHP Internet Transports pagessltls例子有他们。

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

+0

天哪,我觉得自己像个白痴。它只需要这个!非常感谢。我不介意关于包含vs连接变量的宠物。我们都有我们的怪癖。 – SoaperGEM 2009-11-23 17:28:26