Start · Sprachen · PHP · Referenz · openssl_pkcs7_decrypt

openssl_pkcs7_decrypt

Funktion

Entschlüsselt eine S/MIME-verschlüsselte Nachricht aus einer Datei und schreibt das Ergebnis in eine Ausgabedatei.

seit PHP 4.0.6 Kategorie: crypto

Signatur

openssl_pkcs7_decrypt(string $input_filename, string $output_filename, OpenSSLCertificate|string $certificate, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string|null $private_key = null): bool

Beschreibung

openssl_pkcs7_decrypt entschlüsselt eine nach dem S/MIME-Standard (PKCS#7) verschlüsselte E-Mail-Nachricht. Die verschlüsselte Nachricht wird aus der Datei input_filename gelesen, mit dem angegebenen Zertifikat und dem zugehörigen privaten Schlüssel entschlüsselt und das Ergebnis in output_filename geschrieben.

Diese Funktion wird typischerweise bei der serverseitigen Verarbeitung sicherer E-Mails eingesetzt, beispielsweise wenn eine Anwendung verschlüsselte Nachrichten empfängt und deren Inhalt für die weitere Verarbeitung zugänglich machen muss. Voraussetzung ist, dass der Empfänger im Besitz des passenden privaten Schlüssels zum verwendeten Zertifikat ist.

Der private_key-Parameter kann in verschiedenen Formaten übergeben werden: als OpenSSLAsymmetricKey-Ressource (erzeugt z. B. durch openssl_pkey_get_private), als Pfad zu einer PEM-Datei (mit dem Präfix file://), als PEM-String oder als Array [$key, $passphrase], wenn der Schlüssel mit einer Passphrase gesichert ist. Wird null übergeben, versucht PHP, den privaten Schlüssel aus dem Zertifikat selbst zu extrahieren.

Die Ein- und Ausgabedateien müssen als Dateipfade angegeben werden. Es ist auf ausreichende Dateisystemberechtigungen zu achten, und die Ausgabedatei sollte nach der Verarbeitung sicher gelöscht oder gesichert werden, da sie sensible Klartextinhalte enthält.

Parameter

Name Typ Default Beschreibung
$input_filename Pflicht string Pfad zur Datei, die die verschlüsselte S/MIME-Nachricht im PEM-Format enthält.
$output_filename Pflicht string Pfad zur Ausgabedatei, in die der entschlüsselte Nachrichteninhalt geschrieben wird.
$certificate Pflicht OpenSSLCertificate|string Das X.509-Zertifikat des Empfängers, als OpenSSLCertificate-Objekt, PEM-String oder Pfad (mit file://-Präfix).
$private_key OpenSSLAsymmetricKey|OpenSSLCertificate|array|string|null null Der zum Zertifikat gehörende private Schlüssel. Kann als OpenSSLAsymmetricKey-Ressource, PEM-String, Dateipfad (mit file://) oder als Array [$schlüssel, $passphrase] übergeben werden. null veranlasst PHP, den Schlüssel aus dem Zertifikat zu extrahieren.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler — etwa wenn die Entschlüsselung fehlschlägt, der Schlüssel nicht zum Zertifikat passt oder die Dateien nicht gelesen/geschrieben werden können.

Beispiele

S/MIME-Nachricht mit Zertifikat und privatem Schlüssel entschlüsseln

<?php
// Zertifikat und privaten Schlüssel laden
$certFile   = 'file:///pfad/zum/empfaenger.crt';
$keyFile    = 'file:///pfad/zum/privater_schluessel.pem';
$passphrase = 'geheimes_passwort'; // falls der Schlüssel verschlüsselt ist

$inputFile  = '/tmp/encrypted_message.eml';
$outputFile = '/tmp/decrypted_message.eml';

$result = openssl_pkcs7_decrypt(
    $inputFile,
    $outputFile,
    $certFile,
    [$keyFile, $passphrase]
);

if ($result) {
    echo 'Nachricht erfolgreich entschlüsselt.' . PHP_EOL;
    echo 'Inhalt: ' . file_get_contents($outputFile);
} else {
    echo 'Entschlüsselung fehlgeschlagen: ' . openssl_error_string();
}

// Ausgabedatei nach Verarbeitung sicher löschen
unlink($outputFile);
?>
Nachricht erfolgreich entschlüsselt. Inhalt: [entschlüsselter Nachrichtentext]

Entschlüsselung mit bereits geladenem Schlüssel-Objekt

<?php
// Zertifikat aus PEM-Datei laden
$cert = openssl_x509_read(file_get_contents('/pfad/zum/empfaenger.crt'));

// Privaten Schlüssel laden
$privateKey = openssl_pkey_get_private(
    file_get_contents('/pfad/zum/privater_schluessel.pem'),
    'optionale_passphrase'
);

if (!$cert || !$privateKey) {
    die('Zertifikat oder Schlüssel konnte nicht geladen werden: ' . openssl_error_string());
}

$success = openssl_pkcs7_decrypt(
    '/tmp/encrypted.eml',
    '/tmp/plain.eml',
    $cert,
    $privateKey
);

if ($success) {
    echo 'Entschlüsselung erfolgreich.' . PHP_EOL;
    readfile('/tmp/plain.eml');
    unlink('/tmp/plain.eml');
} else {
    echo 'Fehler: ' . openssl_error_string();
}
?>
Entschlüsselung erfolgreich. [entschlüsselter Nachrichteninhalt]

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Die Ausgabedatei enthält den Klartext der Nachricht und sollte nach der Verarbeitung sofort mit unlink() gelöscht werden, um ein versehentliches Offenlegen sensibler Daten zu verhindern.
  • Stellen Sie sicher, dass die Verzeichnisse für Ein- und Ausgabedateien nicht öffentlich zugänglich sind.
  • Der private Schlüssel darf niemals in einem Web-zugänglichen Verzeichnis gespeichert werden.
  • Im Fehlerfall liefert openssl_error_string() weitere Informationen aus dem OpenSSL-Fehlerpuffer.
  • Ab PHP 8.0 werden anstelle von Ressourcen OpenSSLCertificate- und OpenSSLAsymmetricKey-Objekte verwendet. Älterer Code, der resource-Typen erwartet, muss entsprechend angepasst werden.