Signatur
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
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);
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);
// 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_encrypteingesetzt 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).