【发布时间】:2010-12-17 23:53:09
【问题描述】:
我在 Windows 上运行 PHP 5.2.6,我在 php.ini 中取消了 extension=php_curl.dll 和 extension=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 的第七个版本。
-
要解决的一个更普遍的问题是如何消除在网络上发布的曾经很好但随着时间的推移变得糟糕的信息。我想不出一个好的解决方案,但我觉得一个好的解决方案是可能的。