Signatur
Beschreibung
openssl_x509_verify() prüft, ob die Signatur eines X.509-Zertifikats mit dem angegebenen öffentlichen Schlüssel übereinstimmt. Dies ist nützlich, wenn man feststellen möchte, ob ein Zertifikat tatsächlich von einer bestimmten Zertifizierungsstelle (CA) ausgestellt wurde, ohne eine vollständige Zertifikatskette aufzubauen.
Die Funktion verifiziert lediglich die kryptografische Signatur des Zertifikats. Sie prüft nicht, ob das Zertifikat abgelaufen ist, widerrufen wurde oder ob der Aussteller vertrauenswürdig ist. Für eine vollständige Zertifikatsvalidierung sollte stattdessen openssl_x509_checkpurpose() verwendet werden.
Als öffentlicher Schlüssel kann entweder ein OpenSSLAsymmetricKey-Objekt, ein OpenSSLCertificate-Objekt (dessen öffentlicher Schlüssel dann verwendet wird), ein Array im PEM-Format oder ein PEM-kodierter Schlüssel-String übergeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $certificate Pflicht | OpenSSLCertificate|string | Das zu prüfende X.509-Zertifikat als OpenSSLCertificate-Objekt oder als PEM-kodierter String. |
|
| $public_key Pflicht | OpenSSLAsymmetricKey|OpenSSLCertificate|array|string | Der öffentliche Schlüssel, gegen den die Zertifikatssignatur geprüft wird. Kann ein OpenSSLAsymmetricKey-Objekt, ein OpenSSLCertificate-Objekt (dessen Public Key genutzt wird), ein PEM-kodierter Schlüssel-String oder ein Array der Form ['Zertifikat', 'Passwort'] sein. |
Rückgabewert
1 zurück, wenn die Signatur korrekt ist, 0, wenn die Signatur ungültig ist, und -1 bei einem Fehler (z. B. wenn der Schlüssel nicht gelesen werden konnte).Beispiele
Zertifikat gegen den Public Key des Ausstellers prüfen
<?php
// Zertifikat und CA-Zertifikat laden
$certPem = file_get_contents('/pfad/zum/server.crt');
$caCertPem = file_get_contents('/pfad/zur/ca.crt');
$cert = openssl_x509_read($certPem);
$caCert = openssl_x509_read($caCertPem);
if ($cert === false || $caCert === false) {
die('Fehler beim Lesen der Zertifikate.');
}
// Public Key aus dem CA-Zertifikat extrahieren
$caPublicKey = openssl_pkey_get_public($caCert);
$result = openssl_x509_verify($cert, $caPublicKey);
if ($result === 1) {
echo 'Die Signatur ist gültig – das Zertifikat wurde von der CA ausgestellt.';
} elseif ($result === 0) {
echo 'Die Signatur ist ungültig!';
} else {
echo 'Fehler bei der Signaturprüfung: ' . openssl_error_string();
}
Selbstsigniertes Zertifikat gegen seinen eigenen Public Key prüfen
<?php
// Selbstsigniertes Zertifikat aus PEM-String laden
$pemCert = file_get_contents('/pfad/zum/self-signed.crt');
$cert = openssl_x509_read($pemCert);
if ($cert === false) {
die('Zertifikat konnte nicht gelesen werden.');
}
// Bei selbstsignierten Zertifikaten ist der Aussteller gleich dem Inhaber,
// daher kann das Zertifikat direkt als Public-Key-Quelle genutzt werden.
$result = openssl_x509_verify($cert, $cert);
switch ($result) {
case 1:
echo 'Selbstsigniertes Zertifikat: Signatur korrekt.';
break;
case 0:
echo 'Signatur ist ungültig!';
break;
default:
echo 'Fehler: ' . openssl_error_string();
}
// Wichtig · Fallstricke
Sicherheitshinweis: Diese Funktion prüft ausschließlich die kryptografische Signatur des Zertifikats. Für eine vollständige und sichere Validierung — inklusive Ablaufzeit, Zertifikatszweck und Vertrauenskette — sollte openssl_x509_checkpurpose() verwendet werden.
Die Funktion wurde erst in PHP 7.4.0 eingeführt. In älteren PHP-Versionen muss die Signaturprüfung manuell mit openssl_verify() auf Basis der Zertifikatsdaten durchgeführt werden.
Ein Rückgabewert von -1 deutet auf einen internen OpenSSL-Fehler hin. In diesem Fall liefert openssl_error_string() weitere Details zur Fehlerursache.