Start · Sprachen · PHP · Referenz · rnp_op_sign_cleartext

rnp_op_sign_cleartext

Funktion

Signiert Textdaten mit einem privaten Schlüssel und erzeugt eine im Klartext lesbare, signierte OpenPGP-Nachricht (Clearsign-Format).

seit PHP 8.1.0 Kategorie: crypto

Signatur

rnp_op_sign_cleartext(RnpFFI $ffi, RnpInput $input, RnpOutput $output): bool

Beschreibung

rnp_op_sign_cleartext ist Teil der RNP-Erweiterung für PHP und ermöglicht das Erstellen von sogenannten Cleartext-Signaturen nach dem OpenPGP-Standard (RFC 4880). Das besondere Merkmal dieser Signierart ist, dass der Originaltext im Klartext erhalten bleibt und direkt lesbar ist — lediglich der Signaturblock wird als PGP-Artefakt angehängt. Dieses Format ist besonders für E-Mails, Dokumentensignaturen und veröffentlichte Textdateien geeignet.

Im Gegensatz zu kompakten oder eingebetteten Signaturen bleibt bei Cleartext-Signaturen der eigentliche Nachrichteninhalt unverschlüsselt und ohne Kodierung einsehbar. Dies erleichtert manuelle Überprüfungen, ohne dass spezielle Tools zwingend erforderlich sind. Die erzeugte Ausgabe folgt dem bekannten PGP-Klartextsignatur-Format mit den Kopfzeilen -----BEGIN PGP SIGNED MESSAGE----- und -----BEGIN PGP SIGNATURE-----.

Vor dem Aufruf muss ein Signiervorgang mit rnp_op_sign_create konfiguriert werden, d. h. es müssen Schlüssel hinzugefügt sowie ggf. Hash-Algorithmus und weitere Parameter gesetzt worden sein. Die Eingabedaten werden über ein RnpInput-Objekt bereitgestellt, das Ergebnis in ein RnpOutput-Objekt geschrieben.

Diese Funktion eignet sich vor allem für den Einsatz in Nachrichtensystemen, Deployment-Skripten oder überall dort, wo Texte authentisiert, aber nicht verschlüsselt werden sollen.

Parameter

Name Typ Default Beschreibung
$ffi Pflicht RnpFFI Das RNP-FFI-Kontextobjekt, das durch rnp_ffi_create erstellt wurde und den Schlüsselring sowie die Kryptoumgebung kapselt.
$input Pflicht RnpInput Ein RnpInput-Objekt, das die zu signierenden Klartextdaten enthält. Wird typischerweise mit rnp_input_from_memory oder rnp_input_from_path erzeugt.
$output Pflicht RnpOutput Ein RnpOutput-Objekt, in das die fertige Cleartext-signierte Nachricht geschrieben wird. Kann z. B. mit rnp_output_to_memory oder rnp_output_to_path erstellt werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Signierung erfolgreich war. Bei einem Fehler (z. B. kein passender privater Schlüssel im Keyring, fehlende Passphrase, ungültige Eingabe) wird false zurückgegeben.

Beispiele

Einfache Cleartext-Signatur einer Textnachricht

<?php
// RNP-FFI-Kontext erstellen
$ffi = rnp_ffi_create('GPG', 'GPG');

// Schlüsselring laden (Keyring-Datei mit privatem Schlüssel)
rnp_load_keys($ffi, 'GPG', '/pfad/zu/geheimer-schluessel.pgp', RNP_LOAD_SAVE_SECRET_KEYS);

// Passphrasen-Callback registrieren
rnp_ffi_set_pass_provider($ffi, function($ffi, $key, $pgpContext, $createIfNeeded) {
    return 'meine_geheime_passphrase';
});

// Eingabe aus einem String erstellen
$nachricht = 'Dies ist eine wichtige Nachricht, die signiert werden soll.';
$input = rnp_input_from_memory($nachricht);
$output = rnp_output_to_memory();

// Signiervorgangsobjekt erstellen und konfigurieren
$op = rnp_op_sign_create($ffi, $input, $output);

// Signierschlüssel hinzufügen (Schlüssel per Key-ID oder Fingerprint suchen)
$key = rnp_locate_key($ffi, 'email', 'signierung@example.com');
rnp_op_sign_add_signature($op, $key);

// Cleartext-Signatur erzeugen
$erfolg = rnp_op_sign_cleartext($ffi, $input, $output);

if ($erfolg) {
    $signierteNachricht = rnp_output_memory_get_buf($output, false);
    echo $signierteNachricht;
} else {
    echo 'Fehler bei der Signierung.';
}

// Ressourcen freigeben
rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Dies ist eine wichtige Nachricht, die signiert werden soll. -----BEGIN PGP SIGNATURE----- ... -----END PGP SIGNATURE-----

Cleartext-Signatur in eine Datei schreiben

<?php
$ffi = rnp_ffi_create('GPG', 'GPG');
rnp_load_keys($ffi, 'GPG', '/pfad/zu/geheimer-schluessel.pgp', RNP_LOAD_SAVE_SECRET_KEYS);

rnp_ffi_set_pass_provider($ffi, function($ffi, $key, $pgpContext, $createIfNeeded) {
    return 'meine_passphrase';
});

$input  = rnp_input_from_path('/pfad/zu/dokument.txt');
$output = rnp_output_to_path('/pfad/zu/dokument.txt.asc');

$op  = rnp_op_sign_create($ffi, $input, $output);
$key = rnp_locate_key($ffi, 'email', 'autor@example.com');
rnp_op_sign_add_signature($op, $key);
rnp_op_sign_set_hash($op, 'SHA256');

$result = rnp_op_sign_cleartext($ffi, $input, $output);

if ($result) {
    echo 'Datei wurde erfolgreich cleartext-signiert: dokument.txt.asc';
} else {
    echo 'Signierung fehlgeschlagen.';
}

rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
Datei wurde erfolgreich cleartext-signiert: dokument.txt.asc

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Cleartext-Signaturen verschlüsseln nicht den Inhalt. Sie bestätigen lediglich die Authentizität und Integrität des Textes. Für vertrauliche Inhalte muss zusätzlich rnp_op_encrypt eingesetzt werden.
  • Passphrasen sollten niemals im Klartext im Quellcode hinterlegt werden. Verwende Umgebungsvariablen oder sichere Schlüsselverwaltungssysteme für die Übergabe.
  • Das Cleartext-Format ist empfindlich gegenüber Zeilenenden und Leerzeichen am Zeilenende (Trailing Whitespace). Unterschiede im Zeilenende-Format (CRLF vs. LF) können zu Verifikationsfehlern führen.
  • Stelle sicher, dass der private Schlüssel tatsächlich im Keyring geladen ist (RNP_LOAD_SAVE_SECRET_KEYS), sonst schlägt die Signierung lautlos fehl.
  • Die RNP-PHP-Erweiterung muss explizit installiert und aktiviert sein (PECL-Paket rnp).