Start · Sprachen · PHP · Referenz · ssh2_fingerprint

ssh2_fingerprint

Funktion

Ruft den Fingerabdruck (Hash) des öffentlichen Host-Schlüssels eines Remote-SSH-Servers ab.

seit PHP 0.9.0 Kategorie: http

Signatur

ssh2_fingerprint(resource $session, int $flags = SSH2_FINGERPRINT_MD5 | SSH2_FINGERPRINT_HEX): string|false

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

Typ
string|false
Beschreibung
Gibt den Fingerabdruck als Zeichenkette zurück — bei 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 verifiziert: a1:b2:c3:d4:e5:f6:07:08:09:0a:0b:0c:0d:0e:0f:10 Erfolgreich verbunden und authentifiziert.

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;
?>
SHA1 (Hex): da39a3ee5e6b4b0d3255bfef95601890afd80709 SHA1 (Base64): 2jmj7l5rSw0yVb/vlWAYkK/YBwk=

// 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.