Start · Sprachen · PHP · Referenz · rnp_key_export_autocrypt

rnp_key_export_autocrypt

Funktion

Exportiert einen minimalen OpenPGP-Schlüssel im Autocrypt-Format für die Verwendung im <code>Autocrypt</code>-E-Mail-Header.

Kategorie: crypto

Signatur

rnp_key_export_autocrypt(RnpFFI $ffi, string $key, string $subkey, string $uid, int $flags): string|false

Beschreibung

rnp_key_export_autocrypt gehört zur RNP-Kryptografie-Erweiterung für PHP und exportiert einen OpenPGP-Schlüssel in einer abgespeckten, für Autocrypt optimierten Form. Das Autocrypt-Protokoll definiert, wie E-Mail-Clients öffentliche Schlüssel automatisch über spezielle Header austauschen können – dabei wird ein möglichst kompakter Schlüsselexport benötigt, der nur die unverzichtbaren Bestandteile enthält.

Die Funktion erzeugt einen binären (oder base64-codierten) Schlüssel-Blob, der direkt in den Autocrypt:-Header einer E-Mail eingebettet werden kann. Im Gegensatz zu einem vollständigen Schlüsselexport werden dabei nur der primäre Schlüssel, ein einzelner Subkey sowie eine einzelne User-ID exportiert, um die Größe des Headers minimal zu halten.

Typischerweise wird diese Funktion in SMTP-Pipelines oder Mail-Composition-Bibliotheken eingesetzt, die Autocrypt-kompatible E-Mails versenden wollen. Mit dem Parameter uid lässt sich steuern, welche User-ID (also welche E-Mail-Adresse) in den Export aufgenommen wird, was bei Schlüsseln mit mehreren UIDs besonders relevant ist.

Über den flags-Parameter können erweiterte Optionen gesetzt werden, z. B. ob der Export im Rohformat oder base64-kodiert erfolgen soll. Bei Fehler gibt die Funktion false zurück.

Parameter

Name Typ Default Beschreibung
$ffi Pflicht RnpFFI Ein gültiges RNP-FFI-Handle, das zuvor mit rnp_ffi_create() erzeugt wurde und den Schlüsselspeicher repräsentiert.
$key Pflicht string Handle des primären Schlüssels (als Ressourcen-String), der exportiert werden soll. Kann z. B. über rnp_locate_key() ermittelt werden.
$subkey Pflicht string Handle des Subkeys, der in den Autocrypt-Export aufgenommen werden soll. Autocrypt erwartet genau einen Verschlüsselungssubkey.
$uid Pflicht string Handle der User-ID (UID), die in den Export eingebettet wird. Bei Schlüsseln mit mehreren UIDs sollte hier die zur Absenderadresse passende UID gewählt werden.
$flags Pflicht int 0 Bitmaske mit Exportoptionen. Aktuell ist 0 der Standardwert; mögliche Flags sind in den RNP-Konstanten definiert (z. B. für Base64-Ausgabe).

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg einen String mit den exportierten Schlüsseldaten zurück, der direkt in einen Autocrypt:-Header eingebettet werden kann. Bei einem Fehler (ungültige Handles, fehlende Schlüsselbestandteile etc.) wird false zurückgegeben.

Beispiele

Autocrypt-Header für ausgehende E-Mail erzeugen

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

// Schlüsselring aus Datei laden
rnp_load_keys($ffi, 'GPG', file_get_contents('/pfad/zum/pubring.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);

// Primären Schlüssel anhand der E-Mail-Adresse suchen
$key = rnp_locate_key($ffi, 'userid', 'alice@example.com');
if ($key === false) {
    die('Schlüssel nicht gefunden.');
}

// Ersten Subkey ermitteln
$subkeyCount = rnp_key_get_subkey_count($key);
if ($subkeyCount === 0) {
    die('Kein Subkey vorhanden.');
}
$subkey = rnp_key_get_subkey_at($key, 0);

// User-ID ermitteln
$uid = rnp_key_get_uid_handle_at($key, 0);

// Autocrypt-Export erzeugen
$autocryptData = rnp_key_export_autocrypt($ffi, $key, $subkey, $uid, 0);

if ($autocryptData === false) {
    die('Autocrypt-Export fehlgeschlagen.');
}

// Base64-kodiert für den Autocrypt-Header aufbereiten
$autocryptHeader = 'addr=alice@example.com; keydata=' . base64_encode($autocryptData);
echo "Autocrypt: $autocryptHeader\n";

rnp_ffi_destroy($ffi);
Autocrypt: addr=alice@example.com; keydata=mQENBF...

Autocrypt-Export mit Fehlerbehandlung

<?php
$ffi = rnp_ffi_create('GPG', 'GPG');
rnp_load_keys($ffi, 'GPG', file_get_contents('pubring.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);

$key = rnp_locate_key($ffi, 'fingerprint', 'AABBCCDDEEFF00112233445566778899AABBCCDD');

if ($key !== false && rnp_key_get_subkey_count($key) > 0) {
    $subkey = rnp_key_get_subkey_at($key, 0);
    $uid    = rnp_key_get_uid_handle_at($key, 0);

    $result = rnp_key_export_autocrypt($ffi, $key, $subkey, $uid, 0);

    if ($result !== false) {
        // Direkt als Autocrypt-Header-Wert verwendbar
        $headerValue = 'addr=bob@example.org; prefer-encrypt=mutual; keydata=' . base64_encode($result);
        echo $headerValue . "\n";
    } else {
        echo 'Fehler beim Autocrypt-Export.' . "\n";
    }
} else {
    echo 'Schlüssel nicht gefunden oder kein Subkey vorhanden.' . "\n";
}

rnp_ffi_destroy($ffi);

// Wichtig · Fallstricke

Sicherheitshinweis: Beim Autocrypt-Export werden gezielt nur minimale Schlüsselinformationen exportiert. Achte darauf, niemals private Schlüsseldaten in den Autocrypt-Header einzubetten – rnp_key_export_autocrypt exportiert ausschließlich öffentliche Schlüsselanteile.

Abhängigkeit: Die Funktion setzt die PHP-Erweiterung rnp voraus, die auf der librnp-Bibliothek basiert. Sie ist nicht im Standard-PHP-Lieferumfang enthalten und muss separat installiert werden.

Autocrypt-Kompatibilität: Der erzeugte Schlüssel-Blob sollte anschließend Base64-kodiert werden, bevor er in den Autocrypt:-Header eingebettet wird. Die Spezifikation (Autocrypt Level 1) schreibt Base64 ohne Zeilenumbrüche vor.