Start · Sprachen · PHP · Referenz · gnupg_setsignmode

gnupg_setsignmode

Funktion

Setzt den Signierungs-Modus für nachfolgende <code>gnupg_sign()</code>-Aufrufe (z. B. normal, detached oder clear-text).

seit PHP 1.3.0 Kategorie: crypto

Signatur

gnupg_setsignmode(resource $identifier, int $signmode): bool

Beschreibung

gnupg_setsignmode() legt fest, in welchem Format GnuPG eine Signatur erzeugt. Je nach Anwendungsfall kann eine eingebettete (normal), eine losgelöste (detached) oder eine Klartext-Signatur (clear-text) gewünscht sein. Der gewählte Modus gilt für alle nachfolgenden Signieroperationen auf dem übergebenen Ressource-Handle.

Die verfügbaren Modi werden über vordefinierte Konstanten angegeben: GNUPG_SIG_MODE_NORMAL erzeugt eine komprimierte Binärsignatur, bei der die Nutzdaten eingebettet sind; GNUPG_SIG_MODE_DETACH trennt Signatur und Daten, was besonders für E-Mails oder Paketdistributions-Szenarien empfehlenswert ist; GNUPG_SIG_MODE_CLEAR erzeugt eine lesbare ASCII-Signatur, bei der der Originaltext unverändert sichtbar bleibt.

Die Funktion muss nach dem Erstellen des GnuPG-Handles mit gnupg_init() und nach dem Hinzufügen eines Signierschlüssels via gnupg_addsignkey() aufgerufen werden. Der Modus kann jederzeit vor einem neuen gnupg_sign()-Aufruf geändert werden.

Parameter

Name Typ Default Beschreibung
$identifier Pflicht resource Das GnuPG-Ressource-Handle, das zuvor mit gnupg_init() erzeugt wurde.
$signmode Pflicht int Der gewünschte Signierungs-Modus. Gültige Werte sind:
  • GNUPG_SIG_MODE_NORMAL – Komprimierte Binärsignatur mit eingebetteten Daten.
  • GNUPG_SIG_MODE_DETACH – Losgelöste (separate) Binärsignatur.
  • GNUPG_SIG_MODE_CLEAR – Lesbare Klartext-Signatur (ASCII).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Modus erfolgreich gesetzt wurde, andernfalls false (z. B. bei einem ungültigen Wert für signmode).

Beispiele

Detached-Signatur einer Nachricht erzeugen

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

// Signierschlüssel hinzufügen (Fingerprint + optionale Passphrase)
$fingerprint = 'ABCDEF1234567890ABCDEF1234567890ABCDEF12';
gnupg_addsignkey($gpg, $fingerprint, 'geheime-passphrase');

// Losgelösten Signier-Modus setzen
if (!gnupg_setsignmode($gpg, GNUPG_SIG_MODE_DETACH)) {
    die('Signier-Modus konnte nicht gesetzt werden.');
}

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

if ($signatur === false) {
    die('Signierung fehlgeschlagen: ' . gnupg_geterror($gpg));
}

echo "Detached-Signatur (Base64-Ausschnitt):\n";
echo substr(base64_encode($signatur), 0, 60) . "...\n";
Detached-Signatur (Base64-Ausschnitt): iQEzBAABCAAdFiEE...

Klartext-Signatur für eine E-Mail erstellen

<?php
$gpg = gnupg_init();

$fingerprint = 'ABCDEF1234567890ABCDEF1234567890ABCDEF12';
gnupg_addsignkey($gpg, $fingerprint);

// Klartext-Modus: Originaltext bleibt lesbar
gnupg_setsignmode($gpg, GNUPG_SIG_MODE_CLEAR);

$text = 'Vertragsangebot vom 2024-06-01';
$signierterText = gnupg_sign($gpg, $text);

if ($signierterText !== false) {
    echo $signierterText;
} else {
    echo 'Fehler: ' . gnupg_geterror($gpg);
}
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Vertragsangebot vom 2024-06-01 -----BEGIN PGP SIGNATURE----- ... -----END PGP SIGNATURE-----

// Wichtig · Fallstricke

Sicherheitshinweis: Verwende GNUPG_SIG_MODE_DETACH bevorzugt, wenn Signaturen unabhängig von den Daten verifiziert werden müssen (z. B. bei Software-Releases). GNUPG_SIG_MODE_CLEAR ist praktisch für E-Mails, jedoch anfälliger für Manipulationen an Zeilenenden (CRLF/LF-Problematik), die die Verifikation fehlschlagen lassen können.

Die GnuPG-Erweiterung muss explizit kompiliert oder als PECL-Paket installiert sein (pecl install gnupg). Stelle sicher, dass der GnuPG-Schlüsselbund für den PHP-Prozess zugänglich ist (Dateisystemberechtigungen, GNUPGHOME-Umgebungsvariable).