这行得通吗?
我还可以使用同行验证的流上下文来打开 ftps 流吗?
是的。这ftps流包装器使用与https只要您在 PHP 构建中启用了 openssl 扩展,包装器就可用。您可以验证是否ftps包装器可以通过检查输出来获得stream_get_wrappers() https://www.php.net/stream_get_wrappers像这样:
<?php
print_r(stream_get_wrappers());
如果你在 php 构建中启用了 ext/openssl,你会看到ftps在输出中与其他可用的流包装器一起列出。
如何分配 SSL 上下文选项?
所以我疯狂猜测
你真的很接近!您在代码中唯一需要更改的就是替换"ftps"
with "ssl"
如图所示:
<?php
$ctx = stream_context_create(['ssl' => [
'verify_peer' => true,
'cafile' => 'd:/sandbox/mycerts.pem',
'CN_match' => 'ftp-12345678.mywebhoster.com'
]]);
无论你是否使用https, ftps或任何其他流包装器,管理 SSL/TLS 加密的上下文选项始终存储在"ssl"
key.
我应该把用户/密码放在哪里?
正确的?错误的?现在用户+密码作为选项?然后什么?现在用户/密码?还是稍后?我一无所知...
The ftp and ftps流包装器都需要 URI 中的用户名和密码,如下所示:
<?php
$ftpPath = 'ftps://username:[email protected] /cdn-cgi/l/email-protection';
不要被我们这里以明文形式指定的用户/通行证所迷惑。流包装器只会发送用户名和密码after建立加密连接。
把它们放在一起
The opendir() http://www.php.net/manual/en/function.opendir.php函数族支持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:[email protected] /cdn-cgi/l/email-protection/', $ctx);
while (($file = readdir($dirHandle)) !== false) {
echo "filename: $file\n";
}
closedir($dirHandle);
SSL/TLS 名称匹配注意事项
如果它最初不起作用,您应该在不传递附加上下文的情况下进行测试$ctx
包含 SSL 选项。服务器证书的 CN(通用名称)字段必须与"CN_match"
您指定的值(子域的通配符匹配有限)。此外,在即将发布的 PHP-5.6 版本之前,不支持将名称与远程方证书中的主题备用名称字段进行匹配。除非您正在使用 5.6 的开发预览版,否则您将不具备此功能(SAN 匹配),并且如果服务器依赖 SAN,对等验证例程将会失败。