gpt4 book ai didi

php - 是否可以使用流上下文在 PHP 下使用 FTPS?

转载 作者:可可西里 更新时间:2023-11-01 13:11:11 26 4
gpt4 key购买 nike

我了解到在 PHP for Windows 下使用 ftps ('ftp_ssl_connect()') 很困难。您被要求进入构建自己的二进制文件以包含 Open SSL 的漫长旅程......我在 phpseclib 上找到了替代建议(但让 openssl.cnf 正确支持对等验证对我来说也很难......) .

然后我点击了 this article,它令人愉悦的简单示例包括工作对等验证(以避免中间人攻击)引起了我对流的注意:

$uri = 'https://www.bankofamerica.com/';
$ctx = stream_context_create(['ssl' => [
'verify_peer' => true, // important
'cafile' => '/hard/path/to/cacert.pem',
'CN_match' => 'www.bankofamerica.com'
]]);
$html = file_get_contents($uri, FALSE, $ctx); // we are good

但是,这对 ftp 连接有用吗? 我还可以使用经过同行验证的流上下文来打开 ftps 流吗? The php manual hints,ssl 上下文选项也适用于 sftp,但缺乏进一步的指导。

所以我疯狂地猜测:

$ctx = stream_context_create(['ftps' => [
'verify_peer' => true,
'cafile' => 'd:/sandbox/mycerts.pem',
'CN_match' => 'ftp-12345678.mywebhoster.com'
]]);

对吧?错误的?现在用户+密码作为选项?然后什么?用户名/密码现在?还是以后?我一脸懵逼。。。

  • 如何开始扫描远程 ftp 目录内容?
  • 如何从 ftp 服务器上传或下载文件?

这有可能吗? (几行代码会很有帮助......)或者流是否只适用于单一文件访问?

更新:Curl 可能会做我想做的事(包括对等验证和目录 lsiting) as shown in this SO answer 。将在本周晚些时候检查...

最佳答案

这行得通吗?

Can I also use peer-validated stream contexts to open ftps streams?

是的。 ftps 流包装器使用与 https 包装器相同的 SSL 上下文选项,只要您在 PHP 构建中启用了 openssl 扩展,它就可用。您可以通过检查 stream_get_wrappers() 的输出来验证 ftps 包装器是否可用,如下所示:

<?php
print_r(stream_get_wrappers());

如果您在 php 构建中启用了 ext/openssl,您将在输出中看到 ftps 与其他可用的流包装器一起列出。

如何分配 SSL 上下文选项?

So I am wildly guessing

你真的很接近!您唯一需要更改代码的是将 "ftps" 替换为 "ssl",如下所示:

<?php
$ctx = stream_context_create(['ssl' => [
'verify_peer' => true,
'cafile' => 'd:/sandbox/mycerts.pem',
'CN_match' => 'ftp-12345678.mywebhoster.com'
]]);

无论您使用的是 httpsftps 还是任何其他流包装器,管理 SSL/TLS 加密的上下文选项始终存储在 "ssl " 键。

我应该把用户名/密码放在哪里?

Right? Wrong? User+Password as options now? And then what? User/Password now? Or later? I am clueless...

ftpftps 流包装器都需要 URI 中的用户名和密码,如下所示:

<?php
$ftpPath = 'ftps://username:password@example.com';

不要被我们在此处以明文形式指定的用户/密码所迷惑。流包装器只会在建立加密连接后发送用户名和密码。

综合考虑

opendir() 系列函数支持 ftp 包装器(自 PHP 5.0 起)。您可以像使用本地文件系统路径一样使用这些函数:

<?php
$ctx = stream_context_create(['ssl' => [
'verify_peer' => true,
'cafile' => 'd:/sandbox/mycerts.pem',
'CN_match' => 'ftp-12345678.mywebhoster.com'
]]);
$dirHandle = opendir('ftps://username:password@example.com/', $ctx);
while (($file = readdir($dirHandle)) !== false) {
echo "filename: $file\n";
}
closedir($dirHandle);

SSL/TLS 名称匹配注意事项

如果它最初不起作用,您应该在不传递包含 SSL 选项的附加上下文 $ctx 的情况下进行测试。服务器证书的 CN(通用名称)字段必须与您指定的 “CN_match” 值匹配(子域的通配符匹配有限)。此外,在即将发布的 PHP-5.6 版本之前,不支持将名称与远程方证书中的主题备用名称字段进行匹配。除非您使用的是 5.6 的开发预览版,否则您将没有此功能(SAN 匹配),并且如果服务器依赖于 SAN,则对等验证例程将失败。

关于php - 是否可以使用流上下文在 PHP 下使用 FTPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21854012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com