Start · Sprachen · PHP · Referenz · gnupg_sign

gnupg_sign

Funktion

Signiert einen Text mit dem konfigurierten GnuPG-Schlüssel und gibt die Signatur zurück.

seit PHP 1.3.0 Kategorie: crypto

Signatur

gnupg_sign(resource $identifier, string $plaintext): string|false

Beschreibung

gnupg_sign erstellt eine kryptographische Signatur für den übergebenen Klartext. Der zu verwendende Schlüssel muss zuvor mit gnupg_addsignkey konfiguriert worden sein. Die Funktion nutzt den privaten Schlüssel des festgelegten Signierschlüssels.

Das Standard-Signaturformat ist eine clearsign-Signatur (normaler Text mit angehängter Signatur). Dieses Verhalten lässt sich über gnupg_setsignmode ändern, z. B. auf eine detachierte Signatur (GNUPG_SIG_MODE_DETACH) oder eine normale Signatur (GNUPG_SIG_MODE_NORMAL).

Typische Anwendungsfälle sind die Integritätssicherung von E-Mails, Software-Paketen oder Konfigurationsdateien, bei denen der Empfänger die Herkunft und Unverfälschtheit des Inhalts überprüfen können soll.

  • GNUPG_SIG_MODE_NORMAL – Signatur und Text werden komprimiert zusammen ausgegeben.
  • GNUPG_SIG_MODE_DETACH – Nur die Signatur wird zurückgegeben, nicht der Originaltext.
  • GNUPG_SIG_MODE_CLEAR – Clearsign-Format (Standard): Lesbarer Text mit angehängter Signatur.

Parameter

Name Typ Default Beschreibung
$identifier Pflicht resource Eine gültige GnuPG-Ressource, die zuvor mit gnupg_init() erstellt wurde.
$plaintext Pflicht string Der zu signierende Text oder Dateninhalt als Zeichenkette.

Rückgabewert

Typ
string|false
Beschreibung
Gibt im Erfolgsfall die signierte Zeichenkette zurück. Bei einem Fehler (z. B. kein Signierschlüssel gesetzt oder falsches Passwort) wird false zurückgegeben. Über gnupg_geterror() kann die genaue Fehlermeldung abgerufen werden.

Beispiele

Clearsign-Signatur erstellen

<?php
// GnuPG-Ressource initialisieren
$gpg = gnupg_init();

// Signierschlüssel setzen (Fingerabdruck + Passphrase)
$fingerprint = 'ABCDEF1234567890ABCDEF1234567890ABCDEF12';
gnupg_addsignkey($gpg, $fingerprint, 'meine-passphrase');

// Signaturmodus auf Clearsign setzen (Standardwert)
gnupg_setsignmode($gpg, GNUPG_SIG_MODE_CLEAR);

$nachricht = 'Dies ist eine wichtige Nachricht.';
$signiert = gnupg_sign($gpg, $nachricht);

if ($signiert === false) {
    echo 'Fehler: ' . gnupg_geterror($gpg);
} else {
    echo $signiert;
}
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Dies ist eine wichtige Nachricht. -----BEGIN PGP SIGNATURE----- ... -----END PGP SIGNATURE-----

Detachierte Signatur erstellen

<?php
$gpg = gnupg_init();

$fingerprint = 'ABCDEF1234567890ABCDEF1234567890ABCDEF12';
gnupg_addsignkey($gpg, $fingerprint, 'meine-passphrase');

// Nur die Signatur zurückgeben (ohne Originaltext)
gnupg_setsignmode($gpg, GNUPG_SIG_MODE_DETACH);

$inhalt = file_get_contents('paket.tar.gz');
$signatur = gnupg_sign($gpg, $inhalt);

if ($signatur !== false) {
    // Signatur separat speichern
    file_put_contents('paket.tar.gz.sig', $signatur);
    echo 'Detachierte Signatur wurde erstellt und gespeichert.';
} else {
    echo 'Signierung fehlgeschlagen: ' . gnupg_geterror($gpg);
}
Detachierte Signatur wurde erstellt und gespeichert.

// Wichtig · Fallstricke

Sicherheitshinweis: Das Passwort für den privaten Schlüssel sollte niemals im Klartext im Quellcode hinterlegt werden. Verwende stattdessen Umgebungsvariablen oder sichere Secret-Management-Lösungen.

Die Funktion setzt einen zuvor mit gnupg_addsignkey() konfigurierten Schlüssel voraus — fehlt dieser, gibt gnupg_sign false zurück. Wird kein Signaturmodus mit gnupg_setsignmode() gesetzt, ist der Standard GNUPG_SIG_MODE_CLEAR.

Die GnuPG-Erweiterung muss in PHP aktiviert sein (extension=gnupg) und die gpgme-Bibliothek auf dem System installiert sein. Auf Servern ohne eigenen GPG-Schlüsselbund (z. B. in Docker-Containern) ist gegebenenfalls die Umgebungsvariable GNUPGHOME zu setzen.