Signatur
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
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.";
}
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
falsezurü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.