phpseclib 3 accepteert een open streamresource waar zijn SSH/SFTP-constructor anders een hostnaam zou ontvangen. Dat is het openbare overdrachtspunt voor een verbinding die al via een proxy wordt vervoerd.

Eerst brengt de connector een HTTP CONNECT- of SOCKS-tunnel tot stand naar de werkelijke SFTP-server en poort. Daarna wordt de gevestigde stream aan SFTP doorgegeven:

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 is een al verbonden stream, geen proxy-URL. $expectedHostKey is de vertrouwde openbare-sleutelstring van de server, verkregen via het provisioningproces van de applicatie, in het formaat dat phpseclib teruggeeft. De inloggegevens kunnen het ondersteunde wachtwoord zijn of een geladen sleutelobject dat de applicatie kiest.

Bepaal wat de connector teruggeeft

De stream moet al naar de SFTP-server leiden. Voor HTTP CONNECT betekent dat de proxy de bestemming heeft geaccepteerd en dat de volledige proxy-responsheaders zijn verbruikt. Voor SOCKS moet de betreffende onderhandeling succesvol zijn afgerond. Alle SSH-bytes die al voorbij die grens zijn gelezen, moeten beschikbaar blijven voor de SSH-implementatie.

Op dat moment voert phpseclib de SSH-uitwisseling uit en start SFTP over dezelfde stream. De applicatie kan haar gewone SFTP-bewerkingen gebruiken. De constructorinterface voorkomt een applicatiesubklasse wiens taak het zou zijn interne socketvelden te vervangen.

Gerelateerde artikelen