phpseclib 3 akceptuje otwarty zasób strumienia tam, gdzie jego konstruktor SSH/SFTP otrzymałby w przeciwnym razie nazwę hosta. To publiczny punkt przekazania połączenia, które jest już prowadzone przez proxy.

Najpierw łącznik ustanawia tunel HTTP CONNECT lub SOCKS do rzeczywistego serwera SFTP i jego portu. Następnie ustanowiony strumień przekazuje się do 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 to już połączony strumień, a nie adres URL proxy. $expectedHostKey to zaufany ciąg klucza publicznego serwera, uzyskany w procesie przygotowania aplikacji, w formacie zwracanym przez phpseclib. Poświadczenie logowania może być obsługiwanym hasłem lub wczytanym obiektem klucza wybranym przez aplikację.

Zdefiniuj, co zwraca łącznik

Strumień musi już prowadzić do serwera SFTP. W przypadku HTTP CONNECT oznacza to, że proxy zaakceptowało cel i pełne nagłówki odpowiedzi proxy zostały zużyte. W przypadku SOCKS odpowiednie negocjacje muszą zakończyć się powodzeniem. Wszystkie bajty SSH już odczytane poza tą granicą muszą pozostać dostępne dla implementacji SSH.

W tym momencie phpseclib wykonuje wymianę SSH i uruchamia SFTP na tym samym strumieniu. Aplikacja może korzystać ze zwykłych operacji SFTP. Interfejs konstruktora pozwala uniknąć podklasy aplikacji, której zadaniem byłoby zastępowanie wewnętrznych pól gniazda.

Powiązane artykuły