Start · Sprachen · PHP · Referenz · openssl_x509_check_private_key

openssl_x509_check_private_key

Funktion

Prüft, ob ein privater Schlüssel zum öffentlichen Schlüssel eines X.509-Zertifikats passt.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_x509_check_private_key(OpenSSLCertificate|string $certificate, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key): bool

Beschreibung

openssl_x509_check_private_key() überprüft, ob ein gegebener privater Schlüssel kryptografisch zum öffentlichen Schlüssel eines X.509-Zertifikats gehört. Dies ist nützlich, bevor man ein Zertifikat und einen privaten Schlüssel gemeinsam für TLS/SSL-Verbindungen oder digitale Signaturen einsetzt – ein falsches Paar würde sonst zu Laufzeitfehlern oder Sicherheitsproblemen führen.

Die Funktion gibt true zurück, wenn der private Schlüssel mathematisch zum im Zertifikat eingebetteten öffentlichen Schlüssel passt. Sie ist besonders hilfreich bei der Serverkonfiguration, beim Laden von Zertifikatsketten oder beim Validieren von Schlüssel/Zertifikat-Paaren nach der Generierung oder dem Import.

Das certificate-Argument akzeptiert ein OpenSSLCertificate-Objekt (zurückgegeben von openssl_x509_read()), eine PEM-kodierte Zeichenkette oder den Pfad zu einer PEM-Datei (mit file://-Präfix). Der private Schlüssel kann als OpenSSLAsymmetricKey, als PEM-String, als Dateipfad oder als Array der Form [$key, $passphrase] übergeben werden.

Hinweis: Die Funktion prüft nur, ob der Schlüssel zum Zertifikat passt – sie validiert weder die Gültigkeit des Zertifikats noch dessen Vertrauenskette oder Ablaufdatum. Für eine vollständige Validierung ist openssl_x509_verify() oder openssl_pkcs7_verify() heranzuziehen.

Parameter

Name Typ Default Beschreibung
$certificate Pflicht OpenSSLCertificate|string Das X.509-Zertifikat als OpenSSLCertificate-Objekt, PEM-kodierter String oder Dateipfad mit file://-Präfix.
$private_key Pflicht OpenSSLAsymmetricKey|OpenSSLCertificate|array|string Der private Schlüssel als OpenSSLAsymmetricKey-Objekt, PEM-String, Dateipfad mit file://-Präfix oder Array [$pem_or_resource, $passphrase] für passwortgeschützte Schlüssel.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der private Schlüssel zum öffentlichen Schlüssel des Zertifikats passt, andernfalls false. Im Fehlerfall (z. B. ungültiges Zertifikat oder Schlüsselformat) wird ebenfalls false zurückgegeben.

Beispiele

Prüfung eines Schlüssel/Zertifikat-Paares aus PEM-Dateien

<?php
// Zertifikat und privaten Schlüssel aus Dateien laden
$certPem = file_get_contents('/etc/ssl/my-cert.pem');
$keyPem  = file_get_contents('/etc/ssl/my-key.pem');

$cert = openssl_x509_read($certPem);
$key  = openssl_pkey_get_private($keyPem);

if ($cert === false || $key === false) {
    echo 'Fehler beim Laden von Zertifikat oder Schlüssel.' . PHP_EOL;
    exit(1);
}

if (openssl_x509_check_private_key($cert, $key)) {
    echo 'Der private Schlüssel passt zum Zertifikat.' . PHP_EOL;
} else {
    echo 'WARNUNG: Schlüssel und Zertifikat passen NICHT zusammen!' . PHP_EOL;
}
Der private Schlüssel passt zum Zertifikat.

Validierung mit passwortgeschütztem Schlüssel

<?php
// Passwortgeschützter privater Schlüssel
$certPem      = file_get_contents('/etc/ssl/server.crt');
$encryptedKey = file_get_contents('/etc/ssl/server-enc.key');
$passphrase   = 'geheim123';

$cert = openssl_x509_read($certPem);

// Schlüssel als Array mit Passphrase übergeben
$keyArray = [$encryptedKey, $passphrase];

if (openssl_x509_check_private_key($cert, $keyArray)) {
    echo 'Schlüssel stimmt überein – Konfiguration ist korrekt.' . PHP_EOL;
} else {
    echo 'Fehler: Schlüssel und Zertifikat stimmen nicht überein.' . PHP_EOL;
    // Fehlerdetails aus der OpenSSL-Fehlerwarteschlange ausgeben
    while ($msg = openssl_error_string()) {
        echo 'OpenSSL-Fehler: ' . $msg . PHP_EOL;
    }
}
Schlüssel stimmt überein – Konfiguration ist korrekt.

Inline-Erzeugung und sofortige Prüfung eines Schlüsselpaars

<?php
// Neues RSA-Schlüsselpaar generieren
$config = [
    'digest_alg'       => 'sha256',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
];

$keyPair = openssl_pkey_new($config);

// Selbstsigniertes Zertifikat erstellen
$dn = [
    'commonName'   => 'Test CN',
    'countryName'  => 'DE',
];
$csr  = openssl_csr_new($dn, $keyPair);
$cert = openssl_csr_sign($csr, null, $keyPair, 365);

// Jetzt prüfen
$result = openssl_x509_check_private_key($cert, $keyPair);
echo $result ? 'Schlüssel passt – wie erwartet.' : 'Unerwarteter Fehler!';
echo PHP_EOL;
Schlüssel passt – wie erwartet.

// Wichtig · Fallstricke

Sicherheitshinweis: Diese Funktion prüft ausschließlich die mathematische Übereinstimmung von privatem und öffentlichem Schlüssel. Sie überprüft nicht, ob das Zertifikat noch gültig ist, ob es widerrufen wurde oder ob die Zertifikatskette vertrauenswürdig ist. Für eine vollständige Zertifikatsvalidierung sollte zusätzlich openssl_x509_verify() verwendet werden.

Ab PHP 8.0 werden OpenSSL-Ressourcen durch OpenSSLCertificate- und OpenSSLAsymmetricKey-Objekte ersetzt. Die alten Ressource-Typen (resource) sind weiterhin kompatibel, sollten aber nicht mehr in neuem Code verwendet werden.

Bei Fehlern (ungültiges Format, falscher Schlüsseltyp) liefert die Funktion false, ohne eine PHP-Warnung auszulösen. Detailliertere Fehlerinformationen können über openssl_error_string() abgerufen werden.