Signatur
Beschreibung
rnp_save_keys_to_path ist Teil der PHP-Anbindung an die RNP-Bibliothek (OpenPGP-Implementierung) und ermöglicht es, alle im RnpFFI-Kontext geladenen Schlüssel persistent in Dateien zu speichern. Dabei werden öffentliche und private Schlüssel getrennt in die angegebenen Pfade geschrieben.
Der Parameter $format legt fest, in welchem Format die Schlüssel gespeichert werden – typischerweise 'GPG' für binäres OpenPGP-Format oder 'JSON' für ein JSON-basiertes Format. Die Trennung in $pub_path und $sec_path erlaubt es, öffentliche und geheime Schlüsselbunde in separaten Dateien zu verwalten, was einem gängigen Sicherheitsprinzip entspricht.
Diese Funktion ist besonders nützlich, wenn nach dem Erzeugen, Importieren oder Modifizieren von Schlüsseln (z. B. nach dem Setzen eines neuen Passworts oder Hinzufügen einer Benutzer-ID) die Änderungen dauerhaft auf dem Dateisystem gesichert werden sollen. Sie entspricht konzeptionell dem Exportieren eines Schlüsselbunds in GnuPG.
- Öffentliche Schlüssel können gefahrlos an beliebigen Orten gespeichert werden.
- Private Schlüssel (
$sec_path) sollten ausschließlich in sicher abgesicherten Verzeichnissen mit restriktiven Dateisystemberechtigungen abgelegt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ffi Pflicht | RnpFFI | Ein gültiger RNP-FFI-Kontext, der zuvor mit rnp_ffi_create() erstellt und mit Schlüsseln befüllt wurde. |
|
| $format Pflicht | string | Das Ausgabeformat der Schlüsseldatei, z. B. 'GPG' für binäres OpenPGP-Format oder 'JSON' für JSON-Format. |
|
| $pub_path Pflicht | string | Dateipfad, unter dem der öffentliche Schlüsselbund gespeichert wird. Wird der Pfad leer übergeben, werden keine öffentlichen Schlüssel gespeichert. | |
| $sec_path Pflicht | string | Dateipfad, unter dem der private (geheime) Schlüsselbund gespeichert wird. Wird der Pfad leer übergeben, werden keine privaten Schlüssel gespeichert. | |
| $flags Pflicht | int | 0 | Bitmask mit optionalen Steuer-Flags. Üblicherweise 0 für Standardverhalten. Spezifische Flag-Konstanten sind der RNP-Dokumentation zu entnehmen. |
Rückgabewert
true zurück, wenn die Schlüssel erfolgreich gespeichert wurden. Bei einem Fehler (ungültiger Pfad, fehlende Schreibrechte, ungültiges Format) wird false zurückgegeben.Beispiele
Schlüsselpaar erzeugen und in separate Dateien speichern
<?php
// RNP-FFI-Kontext für OpenPGP erstellen
$ffi = rnp_ffi_create('GPG', 'GPG');
// Schlüsselpaar generieren (RSA, 2048 Bit)
$jsonParams = json_encode([
'primary' => [
'type' => 'RSA',
'length' => 2048,
'userid' => 'Max Mustermann <max@example.com>',
'expiration' => 0,
'usage' => ['sign'],
'protection' => [
'cipher' => 'AES256',
'hash' => 'SHA256',
'mode' => 'CBC',
'iterations' => 65536,
'password' => 'geheimesPasswort',
],
],
'sub' => [
'type' => 'RSA',
'length' => 2048,
'expiration' => 0,
'usage' => ['encrypt'],
'protection' => [
'cipher' => 'AES256',
'hash' => 'SHA256',
'mode' => 'CBC',
'iterations' => 65536,
'password' => 'geheimesPasswort',
],
],
]);
if (!rnp_generate_key_json($ffi, $jsonParams, $keyHandle)) {
die('Schlüsselerzeugung fehlgeschlagen');
}
$pubPath = '/var/pgp/pubring.pgp';
$secPath = '/var/pgp/secring.pgp';
// Schlüssel in Dateien speichern
$result = rnp_save_keys_to_path($ffi, 'GPG', $pubPath, $secPath, 0);
if ($result) {
echo "Schlüssel erfolgreich gespeichert.\n";
echo "Öffentlicher Schlüsselbund: $pubPath\n";
echo "Privater Schlüsselbund: $secPath\n";
} else {
echo "Fehler beim Speichern der Schlüssel.\n";
}
rnp_ffi_destroy($ffi);
Importierten Schlüssel laden und als JSON-Datei exportieren
<?php
$ffi = rnp_ffi_create('GPG', 'GPG');
// Vorhandenen öffentlichen Schlüssel importieren
$pubKeyData = file_get_contents('/tmp/imported_public.pgp');
if (!rnp_load_keys_from_memory($ffi, 'GPG', $pubKeyData, RNP_LOAD_SAVE_PUBLIC_KEYS)) {
die('Import fehlgeschlagen');
}
// Als JSON speichern – nur öffentliche Schlüssel (sec_path leer lassen)
$success = rnp_save_keys_to_path($ffi, 'JSON', '/var/pgp/pubring.json', '', 0);
if ($success) {
echo "Öffentlicher Schlüsselbund als JSON gespeichert.\n";
} else {
echo "Speichern fehlgeschlagen.\n";
}
rnp_ffi_destroy($ffi);
// Wichtig · Fallstricke
Sicherheitshinweis: Private Schlüssel ($sec_path) enthalten hochsensible kryptografische Geheimnisse. Stellen Sie sicher, dass die Zieldatei und das Zielverzeichnis mit restriktiven Dateisystemberechtigungen (z. B. chmod 600 für die Datei, chmod 700 für das Verzeichnis) geschützt sind und ausschließlich vom Eigentümer lesbar sind.
Speichern Sie private Schlüssel niemals in öffentlich zugänglichen Verzeichnissen (z. B. public_html, Web-Root). Verwenden Sie zusätzlich Passwortschutz für die privaten Schlüssel (über die Schutzparameter bei der Schlüsselerzeugung).
Die Funktion gehört zur rnp-Erweiterung, die separat installiert und aktiviert sein muss. Prüfen Sie mit extension_loaded('rnp'), ob die Erweiterung verfügbar ist.