phpseclib 3 acepta un recurso de flujo abierto allí donde su constructor SSH/SFTP recibiría de otro modo un nombre de host. Ese es el punto de entrega público para una conexión que ya viaja a través de un proxy.

Primero, el conector establece un túnel HTTP CONNECT o SOCKS hacia el servidor SFTP real y su puerto. Después, pase el flujo establecido a 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 es un flujo ya conectado, no una URL de proxy. $expectedHostKey es la cadena de clave pública de confianza del servidor, obtenida mediante el proceso de aprovisionamiento de la aplicación, en el formato que devuelve phpseclib. La credencial de inicio de sesión puede ser la contraseña admitida o un objeto de clave cargado que elija la aplicación.

Defina qué devuelve el conector

El flujo ya debe llevar al servidor SFTP. Para HTTP CONNECT, esto significa que el proxy ha aceptado el destino y que se han consumido las cabeceras de respuesta completas del proxy. Para SOCKS, la negociación correspondiente debe haberse completado correctamente. Cualquier byte SSH ya leído más allá de ese límite debe seguir disponible para la implementación SSH.

En ese punto phpseclib realiza el intercambio SSH e inicia SFTP sobre el mismo flujo. La aplicación puede usar sus operaciones SFTP habituales. La interfaz del constructor evita una subclase de aplicación cuya tarea sería reemplazar campos internos del socket.

Artículos relacionados