phpseclib 3 přijímá otevřený zdroj streamu tam, kde by jeho konstruktor SSH/SFTP jinak dostal název hostitele. To je veřejný předávací bod pro připojení, které už prochází přes proxy.

Nejprve konektor naváže tunel HTTP CONNECT nebo SOCKS ke skutečnému serveru SFTP a jeho portu. Potom se zavedený stream předá SFTP:

use phpseclib3\Net\SFTP;

$sftp = new SFTP($tunnel);

$actualHostKey = $sftp->getServerPublicHostKey();
if ($actualHostKey === false
    || !hash_equals($expectedHostKey, $actualHostKey)) {
    throw new RuntimeException('Unexpected SFTP server key');
}

if (!$sftp->login($sftpUser, $sftpCredential)) {
    throw new RuntimeException('SFTP login failed');
}

$tunnel je již připojený stream, nikoli proxy URL. $expectedHostKey je důvěryhodný řetězec veřejného klíče serveru získaný procesem provisioningu aplikace, ve formátu, který vrací phpseclib. Přihlašovací údaj může být podporované heslo nebo načtený objekt klíče, který aplikace zvolí.

Definujte, co konektor vrací

Stream už musí vést k serveru SFTP. U HTTP CONNECT to znamená, že proxy přijala cíl a byly spotřebovány kompletní hlavičky odpovědi proxy. U SOCKS musí být příslušné vyjednávání úspěšně dokončeno. Jakékoli bajty SSH již přečtené za touto hranicí musí zůstat k dispozici implementaci SSH.

V tomto okamžiku phpseclib provede výměnu SSH a spustí SFTP na stejném streamu. Aplikace může používat své obvyklé operace SFTP. Rozhraní konstruktoru se vyhýbá podtřídě aplikace, jejímž úkolem by bylo nahradit interní pole socketu.

Související články