Ursache
phpseclib bietet die Host-Key-Algorithmen in der Reihenfolge rsa-sha2-256, rsa-sha2-512
an (SSH2::getSupportedHostKeyAlgorithms). Der TeamSpeak-Server bietet beide, nach
RFC 4253 gewinnt der erste Eintrag der Client-Liste, es wird also rsa-sha2-256
ausgehandelt. TeamSpeak signiert den Host-Key dann trotzdem mit rsa-sha2-512.
phpseclib prüft seit Jahren streng, dass Signatur und ausgehandelter Algorithmus
übereinstimmen, und wirft sonst genau diese Exception (SSH2.php ab Zeile 1940).
Das Verhalten von TeamSpeak ist ein Server-Bug, den der phpseclib-Maintainer
schon 2019 so eingeordnet hat:
https://github.com/phpseclib/phpseclib/issues/1336
Ein Fix auf phpseclib-Seite ist nicht zu erwarten, der Check ist auch im aktuellen
master unverändert.
Mit ext-ssh2 tritt der Fehler nicht auf, weil libssh2 die Abweichung toleriert.
Auf Hostings ohne die Extension ist der SSH-Modus damit aktuell unbenutzbar.
Vorschlag
In TeamSpeakSshHandler::connect() direkt nach dem Erzeugen des SSH2-Objekts
rsa-sha2-512 als bevorzugten Host-Key-Algorithmus setzen. Damit passen Aushandlung
und Signatur zusammen und der Check geht durch:
$this->queryObj = new SSH2($this->hostname, $this->port);
$this->queryObj->setPreferredAlgorithms([
'hostkey' => ['rsa-sha2-512', 'rsa-sha2-256', 'ssh-rsa'],
]);