Start · Sprachen · PHP · Referenz · openssl_pkcs12_read

openssl_pkcs12_read

Funktion

Liest und parst eine PKCS#12-Datei (PFX) und schreibt Zertifikat, privaten Schlüssel und CA-Kette in ein Array.

seit PHP 5.2.2 Kategorie: crypto

Signatur

openssl_pkcs12_read(string $pkcs12, array &$certificates, string $passphrase): bool

Beschreibung

PKCS#12 (auch als PFX bekannt) ist ein binäres Containerformat, das ein X.509-Zertifikat, den zugehörigen privaten Schlüssel und optional eine Kette von CA-Zertifikaten (Certificate Authority) gemeinsam und passwortgeschützt speichert. openssl_pkcs12_read entschlüsselt diesen Container und stellt die enthaltenen Daten als PEM-kodierte Zeichenketten bereit.

Das Ergebnis-Array $certificates enthält nach erfolgreichem Aufruf die Schlüssel cert (das Endzertifikat als PEM-String), pkey (der private Schlüssel als PEM-String) und – falls vorhanden – extracerts (ein Array mit weiteren Zertifikaten der CA-Kette).

Typische Einsatzgebiete sind das Importieren von Zertifikaten aus Windows-Keystores, Browser-Exporten oder von Zertifizierungsstellen ausgestellten Paketen, um diese anschließend für TLS-Verbindungen, E-Mail-Signierung oder Code-Signing innerhalb von PHP zu nutzen.

Da der Container einen privaten Schlüssel enthält, sollte das Ergebnis niemals protokolliert, in unsichere Speicher geschrieben oder über unsichere Kanäle übertragen werden. Die $passphrase ist zwingend erforderlich, wenn das PKCS#12-Archiv passwortgeschützt ist; bei leerem Passwort kann ein leerer String übergeben werden.

Parameter

Name Typ Default Beschreibung
$pkcs12 Pflicht string Der rohe binäre Inhalt der PKCS#12-Datei (nicht der Dateiname). Der Inhalt sollte z. B. mit file_get_contents() eingelesen werden.
$certificates Pflicht array Ausgabe-Array (wird per Referenz übergeben), das nach dem Aufruf die Schlüssel cert, pkey und ggf. extracerts enthält.
$passphrase Pflicht string Das Passwort zum Entschlüsseln des PKCS#12-Containers. Bei ungeschützten Containern kann ein leerer String '' übergeben werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Bei einem falschen Passwort, einem beschädigten Container oder einem nicht unterstützten Format wird false zurückgegeben.

Beispiele

PKCS#12-Datei einlesen und Zertifikat extrahieren

<?php
$pfxData = file_get_contents('/pfad/zur/zertifikat.p12');
$passphrase = 'geheimesPasswort';
$certs = [];

if (openssl_pkcs12_read($pfxData, $certs, $passphrase)) {
    echo "Zertifikat (PEM):\n";
    echo $certs['cert'];

    echo "\nPrivater Schlüssel (PEM):\n";
    // Nur zu Demonstrationszwecken – niemals im Klartext ausgeben!
    echo substr($certs['pkey'], 0, 40) . '...';

    if (!empty($certs['extracerts'])) {
        echo "\nAnzahl CA-Zertifikate: " . count($certs['extracerts']);
    }
} else {
    echo "Fehler beim Lesen der PKCS#12-Datei.";
}
Zertifikat (PEM): -----BEGIN CERTIFICATE----- ... Privater Schlüssel (PEM): -----BEGIN ENCRYPTED PRIVATE KEY-----... Anzahl CA-Zertifikate: 2

PEM-Dateien aus PKCS#12 exportieren und für cURL verwenden

<?php
$pfxData = file_get_contents('/pfad/zur/client.p12');
$certs = [];

if (!openssl_pkcs12_read($pfxData, $certs, 'meinPasswort')) {
    throw new RuntimeException('PKCS#12-Datei konnte nicht gelesen werden.');
}

// Temporäre PEM-Dateien erstellen (in der Praxis sicher verwalten!)
$certFile = tempnam(sys_get_temp_dir(), 'cert_');
$keyFile  = tempnam(sys_get_temp_dir(), 'key_');

file_put_contents($certFile, $certs['cert']);
file_put_contents($keyFile,  $certs['pkey']);

$ch = curl_init('https://api.beispiel.de/gesicherter-endpunkt');
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

// Temporäre Dateien nach Verwendung sofort löschen
unlink($certFile);
unlink($keyFile);

echo $response;

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Der private Schlüssel (pkey) ist hochsensibel. Er sollte niemals geloggt, in Datenbanken gespeichert oder über HTTP übertragen werden.
  • Temporäre Dateien, die den privaten Schlüssel enthalten, müssen nach Verwendung sofort mit unlink() gelöscht werden. Nutze am besten speicherbasierte Übergaben statt Dateisystem.
  • Das Passwort sollte nicht im Quellcode hart kodiert sein – stattdessen Umgebungsvariablen oder einen Secret-Manager verwenden.
  • Bei falschem Passwort gibt die Funktion false zurück, ohne eine Exception zu werfen. Der Rückgabewert muss daher explizit geprüft werden.
  • Unter bestimmten OpenSSL-Versionen kann ein leeres Passwort ('') sich anders verhalten als ein NULL-Wert – im Zweifelsfall testen.