Signatur
Beschreibung
ssh2_fingerprint() gibt den kryptografischen Fingerabdruck des öffentlichen Schlüssels zurück, den der Remote-Server während des SSH-Handshakes präsentiert. Damit lässt sich verifizieren, ob man tatsächlich mit dem erwarteten Server kommuniziert und nicht Opfer eines Man-in-the-Middle-Angriffs geworden ist.
Der Fingerabdruck kann wahlweise als MD5 (Standard) oder SHA1 berechnet und entweder als hexadezimale Zeichenkette oder als rohe Binärdaten zurückgegeben werden. Dazu werden die Konstanten SSH2_FINGERPRINT_MD5, SSH2_FINGERPRINT_SHA1, SSH2_FINGERPRINT_HEX und SSH2_FINGERPRINT_RAW bitweise kombiniert und dem Parameter flags übergeben.
Die Funktion setzt eine aktive SSH-Verbindung voraus, die zuvor mit ssh2_connect() hergestellt wurde. Sie ist Teil der PECL-Erweiterung ssh2 und muss explizit installiert sein (pecl install ssh2).
Typischer Einsatz ist das Known-Host-Verfahren: Der erwartete Fingerabdruck wird aus einer vertrauenswürdigen Quelle (z. B. Konfigurationsdatei) geladen und mit dem tatsächlichen Fingerabdruck verglichen. Stimmen sie nicht überein, wird die Verbindung abgebrochen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $session Pflicht | resource | Eine aktive SSH-Verbindungs-Ressource, wie sie von ssh2_connect() zurückgegeben wird. |
|
| $flags | int | SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX | Bitmaske aus den Konstanten SSH2_FINGERPRINT_MD5 oder SSH2_FINGERPRINT_SHA1 (Hashalgorithmus) und SSH2_FINGERPRINT_HEX oder SSH2_FINGERPRINT_RAW (Ausgabeformat). Standard ist MD5 als Hexadezimalstring. |
Rückgabewert
SSH2_FINGERPRINT_HEX als hexadezimale Darstellung, bei SSH2_FINGERPRINT_RAW als Binärdaten. Im Fehlerfall wird false zurückgegeben.Beispiele
Fingerabdruck prüfen und Verbindung nur bei Übereinstimmung fortsetzen
<?php
// Vertrauenswürdiger, vorher gespeicherter Fingerabdruck
$trustedFingerprint = 'a1:b2:c3:d4:e5:f6:07:08:09:0a:0b:0c:0d:0e:0f:10';
$session = ssh2_connect('example.com', 22);
if (!$session) {
die('SSH-Verbindung fehlgeschlagen.');
}
$fingerprint = ssh2_fingerprint($session, SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX);
if ($fingerprint !== $trustedFingerprint) {
die('WARNUNG: Fingerabdruck stimmt nicht überein! Möglicher MITM-Angriff. Aktuell: ' . $fingerprint);
}
echo 'Fingerabdruck verifiziert: ' . $fingerprint . PHP_EOL;
// Verbindung authentifizieren
if (!ssh2_auth_password($session, 'benutzer', 'geheimesPasswort')) {
die('Authentifizierung fehlgeschlagen.');
}
echo 'Erfolgreich verbunden und authentifiziert.' . PHP_EOL;
?>
Fingerabdruck als SHA1 und Rohdaten abrufen
<?php
$session = ssh2_connect('example.com', 22);
if (!$session) {
die('SSH-Verbindung fehlgeschlagen.');
}
// SHA1-Fingerabdruck als Hex-String
$fpHex = ssh2_fingerprint($session, SSH2_FINGERPRINT_SHA1 | SSH2_FINGERPRINT_HEX);
echo 'SHA1 (Hex): ' . $fpHex . PHP_EOL;
// SHA1-Fingerabdruck als Rohdaten -> dann selbst in Base64 umwandeln
$fpRaw = ssh2_fingerprint($session, SSH2_FINGERPRINT_SHA1 | SSH2_FINGERPRINT_RAW);
echo 'SHA1 (Base64): ' . base64_encode($fpRaw) . PHP_EOL;
?>
// Wichtig · Fallstricke
Sicherheitshinweis: Das alleinige Abrufen des Fingerabdrucks schützt noch nicht vor Man-in-the-Middle-Angriffen. Der Fingerabdruck muss zwingend mit einem vorher aus einer sicheren Quelle bezogenen, vertrauenswürdigen Wert verglichen werden. Wird der Vergleich weggelassen, bietet ssh2_fingerprint() keinen Sicherheitsgewinn.
MD5 gilt als veraltet für kryptografische Prüfzwecke. Wo möglich, sollte SSH2_FINGERPRINT_SHA1 bevorzugt werden. Für noch höhere Sicherheit empfiehlt sich der Einsatz von Bibliotheken, die SHA-256-Fingerabdrücke unterstützen.
Die Funktion steht nur zur Verfügung, wenn die PECL-Erweiterung ssh2 installiert ist. Sie ist nicht Bestandteil des PHP-Kerns. Prüfe die Verfügbarkeit mit extension_loaded('ssh2').
Beim Vergleich von Fingerabdrücken sollte hash_equals() statt === verwendet werden, um Timing-Angriffe zu verhindern.