我如何让SSL在fsockopen中工作?

2022-08-30 19:34:43

我在Windows上运行PHP 5.2.6,我已经在php中取消了注释.ini;因此,我可以看到以下内容:extension=php_curl.dllextension=php_openssl.dllphpinfo

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,我想无论如何我都会将其包含在这里以保持完整性。


我想做的很简单:使用SSL向另一台服务器发出POST请求。
到目前为止,我的代码是这样的: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;
}

当然,如果我只是传入并使用端口80,这当然可以正常工作。但是我真的需要通过SSL发送它,现在它不起作用。 设置为 ,停留在 ,并设置为 。我知道这不是服务器关闭的问题,也不是主机名中的拼写错误等,因为如果我不安全地越过端口80,它确实有效。只有当我尝试切换到SSL时,问题才开始。$host$responsefalse$errno0$errstrphp_network_getaddresses: getaddrinfo failed: No such host is known.

我该怎么做才能使它工作?


答案 1

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

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

我不确定是否需要,但是PHP Internet Transports页面上的和示例具有它们。//ssltls

附言:我也有一个关于字符串中包含的变量的“东西”,以防你想知道为什么它现在使用字符串串联。


答案 2

推荐