如何让 SSL 在 fsockopen 中工作?

Posted

技术标签:

【中文标题】如何让 SSL 在 fsockopen 中工作?【英文标题】:How do I get SSL working in fsockopen? 【发布时间】:2010-12-17 23:53:09 【问题描述】:

我在 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 时才会出现问题。

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

【问题讨论】:

与答案无关,但您是否考虑过使用 tls 协议? TLSv1 本质上是 SSL 的第四个版本,并已广泛取代它成为事实上的 SSL 实现。 只是一个评论,以确保读者知道 TLSv1.0 已被弃用,因为它不是很安全,以及所有版本的 SSL。见en.wikipedia.org/wiki/Transport_Layer_Security。 @DavidSpector 是的,但我希望人们会使用更新版本的 TLS,因为这个问题今天已经 10 岁了。 TLS 1.3 是最新的,它实际上是 SSL 的第七个版本。 要解决的一个更普遍的问题是如何消除在网络上发布的曾经很好但随着时间的推移变得糟糕的信息。我想不出一个好的解决方案,但我觉得一个好的解决方案是可能的。 【参考方案1】:

这听起来很明显,但您是否尝试过?

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

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

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

【讨论】:

天哪,我觉得自己像个白痴。只需要这个!太感谢了。而且我不介意包含变量和连接变量的烦恼。我们都有自己的怪癖。 这对我在其他应用程序中不起作用:发送电子邮件。当我发送不安全并且服务器接受不安全发送时它可以工作,但如果我对方案和端口进行这些更改则不会。我得到一个无限循环。 愚蠢的我。我的端口是 25,因此电子邮件的安全端口必须是 465,而不是 443。通过此更改,我的代码成功发送了一封电子邮件(我的服务器设置为安全)。我已经编辑了这个答案。 @DavidSpector 对于电子邮件,这是关于服务器是否支持 TLS over SMTP 或是否支持 SMTPS 的问题之一。前者在 25 端口,后者在 465 端口。 端口 25(对邮件服务器的不安全访问)不应再使用。它使您的邮件服务器暴露在恶意用户的攻击之下,并且几乎没有或根本没有好处。我同意 Let's Encrypt 项目,即应该确保整个 Web(和电子邮件)的安全。

以上是关于如何让 SSL 在 fsockopen 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

无法让 SSL 在 Docker 容器中工作

无法让 SSL 在 Node.js 应用程序中工作

如何让两种方式的数据绑定在 blazor 中工作?

如何使 CLIENT-CERT SSL 重新协商在 Jetty 中工作?

%f 如何在 java 中工作

无法让cURL命令在Postman中工作