SFTP com phpseclib 3 através de um fluxo proxy estabelecido
Use o construtor público de fluxo do phpseclib 3 para iniciar SFTP através de um túnel HTTP ou SOCKS já estabelecido.
phpseclib 3 aceita um recurso de fluxo aberto onde o seu construtor SSH/SFTP receberia, de outra forma, um nome de host. Esse é o ponto de entrega público para uma conexão já transportada através de um proxy.
Primeiro, o conector estabelece um túnel HTTP CONNECT ou SOCKS para o servidor SFTP real e a respetiva porta. Depois, passa o fluxo estabelecido ao 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 é um fluxo já ligado, não um URL de proxy. $expectedHostKey é a cadeia de chave pública fidedigna do servidor, obtida através do processo de aprovisionamento da aplicação, no formato devolvido pelo phpseclib. A credencial de início de sessão pode ser a palavra-passe suportada ou um objeto de chave carregado escolhido pela aplicação.
Defina o que o conector devolve
O fluxo já deve conduzir ao servidor SFTP. Para HTTP CONNECT, isso significa que o proxy aceitou o destino e que os cabeçalhos de resposta completos do proxy foram consumidos. Para SOCKS, a negociação relevante deve ter sido concluída com sucesso. Quaisquer bytes SSH já lidos além desse limite devem permanecer disponíveis para a implementação SSH.
Nesse ponto, o phpseclib realiza a troca SSH e inicia o SFTP sobre o mesmo fluxo. A aplicação pode usar as suas operações SFTP habituais. A interface do construtor evita uma subclasse da aplicação cuja tarefa seria substituir campos internos de socket.